0

我试图了解 EF 实体模型的实体集实例之间的关系(该模型是由实体设计器创建的)。基本上,我最终得到了 1 个具有实体 Repository 类的 2 个实例的逻辑事务。一个实例中成功提交的数据(通过对 SQLServer 的直接 SSMS 查询确认)不会对另一个实例可见。大致流程如下:

ARepository _aR = new ARepository();

A a = _aR.Find(id);   //Find does something like:  return db.ASet.Where(x => x.id == id);

b.BeginAcctBal = a.AcctBal;  

brepo.AddTxn(params ... n);  //Creates and saves n txns, and creates its own ARepository instance that updates its instance of AcctBal, which I can see happening in the DB)

A a = _aR.Find(id);  //The hope is this gets the updated AcctBal after committed by AddTxn, but it doesn't).

b.EndAcctBal = a.AcctBal;  // Still contains the starting balance value.

现在,如果我ARepository _aR = new ARepository();在 AddTxn 之后立即放置,那么后续代码确实会获得 AddTxn 之后的 AcctBal 值。

问题:

为什么不db.ASet.Where(x => x.id == id);从数据库重新加载?它真的总是从创建 _aR 实例时的快照中读取吗?

如果 _aR 是快照,有没有办法重新加载它?

如果 _aR 是快照,那么如何维护事务完整性?更具体地说,我是否需要做一些事情来维护它,或者 EF 和 MVC 1.0 的组合是否为我带来了这种交易魔法?

4

1 回答 1

1

当您查询 ObjectContext (_aR) 时,默认情况下,它将检查已从数据库中检索到的具有相同 EntityKey 的任何实例。如果它可以找到一个,它将返回已经创建的实例,而不是再次返回数据库。

此行为由 ObjectQuery 的MergeOption 属性确定,默认为 MergeOption.AppendOnly。相反,您可能希望使用MergeOption.OverwriteChangesMergeOption.NoTracking,这将每次都从数据库中获取值。

以下是一些可能有用的参考资料:

  1. MergeOptions 的讨论
  2. 对象上下文的刷新方法
  3. 保存更改和管理并发(实体框架)
  4. 类似的论坛帖子
于 2009-12-31T00:53:54.127 回答