EF4.4如何根据请求设置StoreWins,而不是单独刷新?

时间:2014-02-26 05:46:54

标签: c# caching entity-framework-4

我们有多个有界上下文,有时需要在我们的请求中强制使用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,我们不会为每个新请求重新生成。

1 个答案:

答案 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();