我对实体框架中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固定行为的情况下,是因为某些非常奇怪的原因,DbSetDbQuery都不公开MergeOption属性。如果使用ObjectContext API,则可以通过显示在MergeOptionObjectSet上的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/

10-14 06:03