我对实体框架中DbContext的用法有些困惑。这是我很困惑的情况。
我使用来自dbcontext的linq查询来获取数据。就像是:
List<Transactions> transactions = DefaultContext.Transactions.ToList();
然后,我直接在数据库中更新该查询返回的事务之一中的列。
然后我再次打电话:
List<Transactions> transactions = DefaultContext.Transactions.ToList();
当列表这次返回时,它不会反映我在运行update语句时所做的更新/更改,除非我遍历所有事务并重新加载它们:
foreach (DbEntityEntry<Transactions> item in DefaultContext.ChangeTracker.Entries<Transactions>())
{
DefaultContext.Entry<Transactions>(item.Entity).Reload();
}
这是正常行为吗?我假设在我的初始查询中,它们已附加到对象上下文。然后,当我第二次查询时,它不会访问数据库,只会从对象上下文中拉出实体,除非我清除/分离或单独重新加载所有实体。
最佳答案
这是正常现象,在DbContext API固定行为的情况下,是因为某些非常奇怪的原因,DbSet
或DbQuery
都不公开MergeOption
属性。如果使用ObjectContext API,则可以通过显示在MergeOption
和ObjectSet
上的ObjectQuery
来设置行为。因此,如果要刷新数据库中的值(并丢失更改),可以执行以下操作:
ObjectContext objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
ObjectSet<Transactions> set = objectContext.CreateObjectSet<Transactions>();
set.MergeOption = MergeOption.OverwriteChanges;
List<Transactions> transactions = set.ToList();
如果您只想刷新事务但又不想丢失所做的更改,则可以使用
MergeOption.PreserveChanges
。关于c# - Entity Framework 和DbContext-对象跟踪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7099134/