2013-02-21 69 views
3

我需要使用實體框架4.1(POCO)在單擊按鈕上單擊更新100條記錄。我需要將修改後的記錄保存到數據庫中,而不進行數據庫往返(以避免性能問題)。在實體框架中更新記錄的最佳做法是什麼?

我已經看到一些解決方案與附加。

得到錯誤的附加 一個實體對象不能被IEntityChangeTracker的多個實例

所以嘗試分離第一次引用,得到了新的錯誤 對象不能被分離,因爲它沒有連接到ObjectStateManager

我使用存儲庫模式來獲取實體列表並傳遞到UI層綁定在gri d。

在按鈕點擊,我傳遞這些實體返回DB層更新。

它工作正常,選擇實體並執行context.applychanges。我需要避免這種往返行程,以解決性能問題。

public void Update(OPRPortCall portCall) 
    { 
     using (VMEntities context = new VMEntities()) 
     { 
      context.Detach(portCall); //The object cannot be detached because it is not attached to the ObjectStateManager. 
      context.AttachTo("OPRPortCalls", portCall); //An entity object cannot be referenced by multiple instances of IEntityChangeTracker 
      context.ObjectStateManager.ChangeObjectState(portCall, EntityState.Modified); 

      context.SaveChanges(); 
     } 
    } 

向我提供任何解決方案。

克里斯托弗

+0

你能後的更新代碼?特別是,當你打開和關閉dbcontext。 – 2013-02-21 11:07:06

+0

「所以先嚐試分離,得到新的錯誤」 - 您需要將它從它所連接的上下文中分離出來。它不會附加到新的上下文中,因此將它從新的上下文中分離出來並不是也不行。但是如果你仍然有舊的上下文(並且你做了,否則該實體不能被附加到它),爲什麼不直接在這個舊的上下文中調用'SaveChanges()'? – hvd 2013-02-21 11:22:27

+0

dtryon更新了代碼。請檢查。 – ChristopherJ 2013-02-21 11:22:53

回答

0

,可以分離只能從上下文中檢索實體,在你的榜樣,你創建上下文(在這一刻沒有實體就可以了)後,你嘗試分離。

對於第二個問題,我認爲您有另一個實體已連接的上下文,因此您無法將實體附加到第二個上下文。

對於這個問題(附加/分離),避免創建多個上下文並使用ONLY ONE上下文(也許你可以將它作爲函數參數傳遞或設置爲私有類變量)。

對於具體問題,更新100名的實體,您可以:1. 創建一個存儲過程,如果你能爲所有的實體更新同一列(傳遞給它的值,並執行UPDATE語句) 2.更新所有實體和後所有使用此命令調用SubmitChages()EF執行UPDATE TABLE 100次 3.執行鍼對數據庫的自定義查詢命令,如「UPDATE TABLE SET ...」

我希望這可以幫到您。

1

從技術上講,你可以先測試解決這個物體是否已經連接與否:

public void Update(OPRPortCall portCall) 
{ 
    using (VMEntities context = new VMEntities()) 
    { 
     ObjectStateEntry ose; 
     this.ObjectStateManager.TryGetObjectStateEntry(portCall, out ose); 
     if (ose == null) 
     { 
      context.OPRPortCalls.Attach(portCall); 
     } 
     context.ObjectStateManager.ChangeObjectState(portCall, EntityState.Modified); 

     context.SaveChanges(); 
    } 
} 
相關問題