2009-12-30 80 views
0

我想了解EF實體模型(該模型是由實體設計器創建的)的實體集實例之間的關係。基本上我最終得到1個邏輯事務,其中有2個實體的Repository類實例。在一個實例中成功提交數據(通過直接SSMS查詢確認到SQLServer)對其他實例不可見。這裏的大致流程:具有多個實體集實例的MVC實體框架狀態行爲

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);沒有從DB重裝?實際上是否總是從創建_aR實例時的快照中讀取?

如果_aR是一個快照,有什麼方法可以重新加載它?

如果_aR是快照,如何維護事務完整性?更具體地說,我是否需要做一些事情來維護它,或者EF和MVC 1.0的組合對我來說是否是這種交易魔術?

回答

1

當您查詢ObjectContext(_aR)時,通過默認,它將檢查任何已使用相同EntityKey從數據庫中檢索到的實例。如果它能找到一個,它將返回已經創建的實例,而不是再次返回到數據庫。

此行爲由ObjectQuery的MergeOption propery確定,默認爲MergeOption.AppendOnly。相反,您可能需要使用MergeOption.OverwriteChangesMergeOption.NoTracking,它將每次從DB獲取值。

這裏有一些引用可能會有所幫助:

  1. Discussion of MergeOptions
  2. Object Context's Refresh Method
  3. Saving Changes and Managing Concurrency (Entity Framework)
  4. Similar forum post