mse*_*dio 2 c# entity-framework .net-4.0 visual-studio-2010 entity-framework-4.1
我对实体框架中DbContext的使用有点困惑.这是我很困惑的情景.
我使用dbcontext中的linq查询来获取数据.就像是:
List<Transactions> transactions = DefaultContext.Transactions.ToList();
Run Code Online (Sandbox Code Playgroud)然后我直接在数据库中更新该查询中返回的一个事务中的列.
然后我再打电话:
List<Transactions> transactions = DefaultContext.Transactions.ToList();
Run Code Online (Sandbox Code Playgroud)当列表返回这次时,它不反映我在运行update语句时所做的更新/更改,除非我遍历所有事务并重新加载它们:
foreach (DbEntityEntry<Transactions> item in DefaultContext.ChangeTracker.Entries<Transactions>())
{
DefaultContext.Entry<Transactions>(item.Entity).Reload();
}
Run Code Online (Sandbox Code Playgroud)
这是正常的行为吗?我假设在我的初始查询中,它们被附加到对象上下文.然后当我第二次查询时,它不会访问数据库,只是从对象上下文中提取实体,除非我清除/分离或单独重新加载所有实体.
这是正常的,并且在DbContext API固定行为的情况下,因为从一些非常奇怪的原因既没有DbSet
或DbQuery
暴露MergeOption
属性.对于ObjectContext API,您可以通过MergeOption
on 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
.
归档时间: |
|
查看次数: |
6975 次 |
最近记录: |