Model view controller 具有entityset多个实例的MVC实体框架状态行为
我试图理解EF实体模型(该模型由实体设计器创建)的entityset实例之间的关系。基本上,我最终得到了一个逻辑事务,它有一个实体的存储库类的两个实例。在一个实例中成功提交的数据(通过直接向SQLServer进行SSMS查询确认)不会对另一个实例可见。大致流程如下: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 =>
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.OverwriteChanges或MergeOption.NoTracking,这将每次从数据库中获取值
以下是一些可能有帮助的参考资料: