我试图了解 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 的组合是否为我带来了这种交易魔法?