我们有多个有界上下文,有时需要在我们的请求中强制使用RefreshMode.StoreWins。
目前我们这是一个两步过程:
// Run my query, this handles refreshing WRT adds/deletes from other dbContext
var myThings = dbContext.Set<MyThing>()
.Where(x => x.blah)
.ToList();
// Get all entities in the change tracker.... any of them might have changed...!
var allEntities = DataContext.ChangeTracker.Entries().Select(c => c.Entity).ToList();
// Refresh all these entities, this handles refreshing WRT updates from other dbContext
(((IObjectContextAdapter)dbContext).ObjectContext).Refresh(RefreshMode.StoreWins, allEntities);
这对于我们的应用程序的正确功能是必要的。
然而它非常低效 - 我知道EF只是去数据库运行我的查询,但是由于一些内置的默认值RefreshMode.ClientWins,它选择将自己的副本保存在内存中。
我可以设置RefreshMode.StoreWins的一些全局默认值,或者,我可以基于每个请求指出这个吗?
P.S。我们必须在给定屏幕的生命周期内保留DbContexts,我们不会为每个新请求重新生成。
答案 0 :(得分:0)
经过一番研究,看来在每个查询的基础上在EF4中执行此操作的最佳方法是使用ObjectQuery而不是DbQuery,并设置MergeOption。这很笨重,但做得很好:
var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext;
var query = objectContext.CreateObjectSet<SomeModel>()
.Where(x => x.Blah);
((ObjectQuery)query).MergeOption = MergeOption.OverwriteChanges;
return query.ToList();