2012-07-26 48 views
3

當我添加多個連續數據時,SaveChanges()方法中發生錯誤。添加第二個數據時的ObjectStateManager錯誤(實體框架)

EXCEPTION 對數據庫的更改已成功提交,但更新對象上下文時發生錯誤。 ObjectContext可能處於不一致的狀態。內部異常消息:由於對象的鍵值與ObjectStateManager中的另一個對象衝突,因此AcceptChanges無法繼續。在調用AcceptChanges之前確保鍵值是唯一的。

我baseservice

public void Delete(T entity) 
    { 
     ObjectSet.DeleteObject(entity); 
     Context.SaveChanges(); 
    } 

    public void Add(T entity) 
    { 
     ObjectSet.AddObject(entity); 
     Context.SaveChanges(); 

    } 

    public void Attach(T entity) 
    { 
     ObjectSet.Attach(entity); 
     Context.SaveChanges(); 
    } 

    public void Update(Expression<Func<T, bool>> where, T entity) 
    { 
     var ent = First(where); 
     ent = entity; 
     Context.SaveChanges(); 
    } 
+0

這是怎麼發生的(例如'Add(T entity)','Attach(T entity)')?你可以發佈堆棧跟蹤嗎? – 2012-07-26 14:08:53

+0

其添加(T實體) – 2012-07-26 14:11:08

回答

1

我有這個問題,並發現我在做下面的操作,使的EntityFramework同步不成爲與數據庫中的數據:

1)通過Entity Framework的上下文查詢表中的行。這樣做,EntityFramework上下文將在其「本地」視圖中保留這些對象的副本。

2)通過SQL查詢截斷表(因此實體框架上下文並不知道發生了這種情況,即使它們在數據庫中被截斷,實體仍處於其本地視圖中)。 由於表的主鍵是自動遞增(IDENTITY(1,1)),所以截斷調用使表的主鍵計數器重置爲1.

3)通過實體框架向表中添加行,然後調用SaveChanges()。由於表格截斷,新行的主鍵爲1.創建行後,EntityFramework爲數據庫查詢行值,創建一個新的實體,在實體中填充值並將實體添加到其本地視圖。

由於上下文已經有另一個主鍵存儲在其本地視圖中的對象(來自步驟1),因此它會嘗試向本地視圖添加具有相同主鍵的第二個實體時引發異常。

爲避免出現這種情況,在進行新操作之前,實體框架必須與數據庫內容保持同步。

就我而言,我不得不通過調用來解決這個問題:

Context.MyTableEntities.Local.Clear(); 
Context.SaveChanges(); 

所以實體首次刪除,並在上下文被告知這件事。然後我用SQL Query截斷表以重置自動增量計數器。由於首先從本地視圖中刪除了對象,並且之後完成了表格截斷(因此重置了自動增量計數器),所以避免了主鍵衝突。

希望有所幫助。