代码之家  ›  专栏  ›  技术社区  ›  Brendan Hill

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

  •  0
  • Brendan Hill  · 技术社区  · 10 年前

    我们有多个有边界的上下文,有时需要对请求强制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的一些全局默认值吗?或者,我可以在每个请求的基础上指示这一点吗?

    注意:我们必须在给定屏幕的生命周期内保留DbContexts,我们不会为每个新请求重新生成。

    1 回复  |  直到 10 年前
        1
  •  0
  •   Brendan Hill    10 年前

    经过一些研究,在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();