2013-04-21 96 views
6

我在嘗試更新現有的實體。發生參照完整性約束衝突

我有以下代碼:

public MamConfiguration_V1 Save(MamConfiguration_V1 item) 
{ 
    mMaMDBEntities.MamConfiguration_V1.Attach(item); 
    mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 
    mMaMDBEntities.SaveChanges(); 
    return item; 
} 

Attach方法拋出一個異常:

參照完整性約束衝突發生了:定義引用約束的屬性值之間不相一致關係中的主體和依賴對象。

我該如何解決這個問題?

回答

3

該物品對象的定義是什麼?似乎在其中的一些集合中,與其他實體之間的交往關係存在某種類型的衝突。您可以嘗試清除所有集合以查看問題是否仍然存在,但在這種情況下,您丟失了外鍵分配。但也許它可以幫助你找到問題。

這可能是一個提示。當我嘗試現有實體重視的背景下,我用它來執行以下操作:

mMaMDBEntities.Entry<MamConfiguration>(item).State = System.Data.EntityState.Modified; 

您可以添加使用System.Data以避免寫這一切的時候所需要的。

這會將實體附加到您想要的狀態,在此情況下進行修改並跟蹤更改。這是一行而不是兩行。

8

好像你與item中的外鍵字段和導航屬性有一些關係,並且這些字段有衝突的值。當您加載實體及其相關實體時,會發生這種情況,在一端更改關係,僅將該端標記爲Modified並嘗試保存。確保您在調用SaveChanges之前修改了兩端的關係並將所有受影響的實體標記爲Modified

+1

任何簡單的方法來泡了修改後的標誌? – 2013-04-29 10:51:44

+2

在正常情況下,EF會自行跟蹤更改,您可以在不手動設置標誌的情況下調用「SaveChanges」。在斷開連接的情況下,沒有簡單的方法,但您必須手動將其標記爲已修改。 – 2013-04-29 11:26:55

+0

即使'AutoDetectChangesEnabled'設置爲true,我也會收到此錯誤。我不需要相關的實體,所以我沒有加載它們並解決了這個問題。 – 2017-07-26 10:38:46

4

我在不同的情況下遇到了這個異常,我在這裏發帖,因爲這個問題出現在錯誤信息搜索時。

使用部分加載的實體調用IObjectContextAdapter.ObjectContext.AttachTo(entitySetName, entity)時引發異常。實體上的外鍵已定義,但導航屬性未加載。 (也就是說,O.ItemID有一個值,但O.Item爲空)。具體情況不允許O.Item加載。

問題原來是,對象狀態管理器已經在單獨的方法中加載了對象,並且已經在跟蹤使用相同鍵定義的對象。由於單獨的方法不需要跟蹤對象狀態,因此通過在該方法內調用IQueryable.AsNoTracking()來解決問題。

1

對我來說問題是實體框架已經在多個位置加載了我的對象,所以當我更新一個外鍵時,現在有兩個對同一個對象的引用,一個外鍵指向記錄一個,一個指向記錄b的外鍵,由於我的關係是一對一而導致錯誤。要解決這個問題,我用context.Entry(對象).STATE = EntityState.Detached,重新加載的對象,所做的外鍵更改,然後救了我的變化

+0

謝謝!這解決了我的問題。 – brady 2017-03-13 01:30:13

相關問題