簡體   English   中英

新子項在Entity Framework 4中插入現有父項

[英]New child inserts existing parent in Entity Framework 4

當我嘗試向現有父對象添加新的子關系時, 實體嘗試將父對象插入為對象,而不是將其更新為已修改 我收到一個錯誤,說它試圖插入一個重復的密鑰

這真的讓我感到困惑,直到我用一個新關系更新模型(通過數據庫更新,而不是代碼優先),它才表現得像這樣。 在相同上下文中具有相同多對多模式的其他表不會導致此錯誤!

我發現如果我將我的子對象添加到上下文中,仔細設置ID值,而不是導航屬性,它將保存正常。 但是修復過程不是將子對象添加到導航集合中 ,這會導致其他地方出現邏輯問題。

我的模型有很多這樣的關系:

選項 - <optionUnit> - 單位

Option和Unit對象都存在加載到上下文中。

通常我會創建橋表並設置如下導航屬性:

bridge = new OptionUnit()
{
    OptionUnitId = Guid.NewGuid(),
    Unit = SelectedUnit,
    Option = SelectedOption,
};
//Context.OptionUnits.Add(bridge); //added to context via the navigation properties

但是當我這么做的時候,實體試圖將SelectedOption插入為新的(即使它的實體狀態在保存時被修改,而不是新的或分離的)。

為了解決這個問題,我不得不建立橋梁並設置id。 我在保存時沒有收到任何錯誤,但它不會像我期望的那樣通過修復自動添加到SelectedOption.OptionUnits。 如果我手動將其添加到集合中,我再次收到保存錯誤。

bridge = new OptionUnit()
{
    OptionUnitId = Guid.NewGuid(),
    //Unit = SelectedUnit,
    UnitId = SelectedUnit.UnitId,
    //Option = SelectedOption,
    OptionId = SelectedOption.OptionId,
};
Context.OptionUnits.Add(bridge);

這似乎只發生在選項實體的關系上。 另外一個關系,在optionUnit> - Unit之間沒有任何問題,並按預期工作。

對於這種關系來說,這似乎有些不對,但我不確定在哪里看。 我需要知道導致這種行為的原因,如何修復它,以及如何防止它在將來發生....

令人難以置信的是,Julie Lerman剛剛收到了一篇關於這個確切問題及其發生原因的MSDN文章。 你可以在這里找到這篇文章。

用朱莉自己的話說:

它發生的原因是,當您使用DbSet.Add方法時,不僅將根實體的狀態標記為“已添加”,而且上下文之前未知的圖中的所有內容都標記為已添加。 即使開發人員可能知道該對象具有現有Id值,Entity Framework也會尊重其EntityState(已添加)並為該對象創建Insert數據庫命令,而不管現有Id是什么。

那么這里簡單地說,當你說Context.OptionUnits.Add(bridge); ,它也認為你也試圖將Option和Unit對象添加到它。 相反,你需要使用FK(如她提到的那樣),然后添加它。

我認為這就是你在第二次嘗試時要做的事情,但我想知道你是如何檢查它是否在SelectedOption.OptionUnits 保存后是否正在嘗試檢查? 在這種情況下,它不會顯示,因為當Entity Framework提取該值時,該值會緩存在內存中。 之后你需要嘗試再次提出該對象。

我發現了這個問題。 添加子項后,我會運行一些邏輯來更新一些總計。 問題是我使用了RaiseDataMemberChanged(“sum”)而不是RaisePropertyChanged(“sum”)。 RaiseDataMemberChanged()必須將實體中的某些內容標記為已修改,並且正在解決此問題。 感謝IronMan84的所有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM