实体框架和DbContext - 对象跟踪

mse*_*dio 2 c# entity-framework .net-4.0 visual-studio-2010 entity-framework-4.1

我对实体框架中DbContext的使用有点困惑.这是我很困惑的情景.

当列表返回这次时,它不反映我在运行update语句时所做的更新/更改,除非我遍历所有事务并重新加载它们:

foreach (DbEntityEntry<Transactions> item in DefaultContext.ChangeTracker.Entries<Transactions>())
{
    DefaultContext.Entry<Transactions>(item.Entity).Reload();
}
Run Code Online (Sandbox Code Playgroud)

这是正常的行为吗?我假设在我的初始查询中,它们被附加到对象上下文.然后当我第二次查询时,它不会访问数据库,只是从对象上下文中提取实体,除非我清除/分离或单独重新加载所有实体.

Lad*_*nka 8

这是正常的,并且在DbContext API固定行为的情况下,因为从一些非常奇怪的原因既没有DbSetDbQuery暴露MergeOption属性.对于ObjectContext API,您可以通过MergeOptionon ObjectSet和on 来设置行为ObjectQuery.因此,如果您想刷新数据库中的值(并丢失更改),您可以执行以下操作:

ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
ObjectSet<Transactions> set = objectContext.CreateObjectSet<Transactions>();
set.MergeOption = MergeOption.OverwriteChanges;
List<Transactions> transactions = set.ToList();
Run Code Online (Sandbox Code Playgroud)

如果您只想刷新交易,但又不想丢失更改,则可以使用MergeOption.PreserveChanges.