我正在努力更好地了解System.Data.Entity.DbContext
。
1)对于持久化数据,该类只有SaveChanges
方法。这是否意味着只能对特定记录进行更改?
2)如果数据库中的数据被更改(由另一个应用程序),上下文如何获取最新信息?这是自动处理,还是数据后期绑定?我没有看到任何Refresh
方法。
对此也有任何有用的参考资料。
答案 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
,就不会实际查询数据库。这意味着您可以添加其他Where
或OrderBy
而无需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()