试图了解DbContext

时间:2014-05-14 14:36:46

标签: c# asp.net-mvc entity-framework ef-code-first

我正在努力更好地了解System.Data.Entity.DbContext

1)对于持久化数据,该类只有SaveChanges方法。这是否意味着只能对特定记录进行更改?

2)如果数据库中的数据被更改(由另一个应用程序),上下文如何获取最新信息?这是自动处理,还是数据后期绑定?我没有看到任何Refresh方法。

对此也有任何有用的参考资料。

2 个答案:

答案 0 :(得分:1)

  

这是否意味着只能对特定记录进行更改?

是的,这是真正的AFAIK。但是您可以毫无问题地创建多个DbContext实例。

  

如果数据库中的数据被更改(由另一个应用程序),上下文如何获取最新信息?

在构造上下文时,但在请求时,不会加载数据:

using(var db = new MyDbContext())
{
    var items = db.MyItems.Where(i => i.Something == true);
    var list = items.ToList(); // <= here the DB is queried
}

items将是IQueryable<MyItem>对象,只要您保留IQueryable,就不会实际查询数据库。这意味着您可以添加其他WhereOrderBy而无需DB访问权限。只要您将其转换为IEnumerable(例如,使用我的示例中的ToList)或执行某些特定方法(例如First),就会查询数据库。

答案 1 :(得分:1)

1)SaveChanges保存所有未保存的更改,这些更改是可见的&#39;通过当前的DbContext(对从此dbcontext加载的实体的更改,添加到此dbContext的DbSet的新实体,实体&#39;通过dbContext.Entry(someObject).State = ...附加到此上下文中)。

如果您只想保存一个实体 - 则不得更改其他实体,或使用不同的dbContext,或使用State。最后两个是&#34;奇怪&#34;,所以只需更改您的代码,这样它就不会触及您不想保存的实体。例如,不要通过Add添加新对象(然后保存在单独的变量中)。此外,在DbSet中有一个AsNoTracking方法,detaches一旦读取它们就加载了对象,你可以自由地改变它们 - DbContext不会跟踪这些实体,也不会&#34;看到&#34;这种变化。

2)已加载的实体有Reload方法:dbContext.Entry(someObject).Reload()