Model view controller 具有entityset多个实例的MVC实体框架状态行为

Model view controller 具有entityset多个实例的MVC实体框架状态行为,model-view-controller,integrity,entityset,Model View Controller,Integrity,Entityset,我试图理解EF实体模型(该模型由实体设计器创建)的entityset实例之间的关系。基本上,我最终得到了一个逻辑事务,它有一个实体的存储库类的两个实例。在一个实例中成功提交的数据(通过直接向SQLServer进行SSMS查询确认)不会对另一个实例可见。大致流程如下: ARepository _aR = new ARepository(); A a = _aR.Find(id); //Find does something like: return db.ASet.Where(x =>

我试图理解EF实体模型(该模型由实体设计器创建)的entityset实例之间的关系。基本上,我最终得到了一个逻辑事务,它有一个实体的存储库类的两个实例。在一个实例中成功提交的数据(通过直接向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\u aR=newarepository()
紧接着AddTxn之后,随后的代码确实获得了post AddTxn AcctBal值

问题:

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

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


如果_aR是快照,如何维护事务完整性?更具体地说,我需要做些什么来维护它,还是EF和MVC 1.0的结合为我带来了这种事务魔法?

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

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

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