實體框架不會將SaveChanges保存在具有兩級關係的新實體上

entity-framework savechanges

我正在使用ADO.NET實體框架構建ASP.NET MVC站點。我有一個包含這些實體的實體模型,由外鍵關聯:

報告(ID,日期,標題,Report_Type_ID等)

  • SubReport(ID,ReportText等) - 與Report的一對一關係。
    • ReportSource(ID,Name,Description) - 與Sub_Report的一對多關係。
      • ReportSourceType(ID,Name,Description) - 與ReportSource的一對多關係。
      • 聯繫人(ID,姓名,地址等) - 與Report_Source的一對一關係。

每種類型的SubReport都有一個Create.aspx頁面。 post事件方法返回一個新的Sub_Report實體。

以前,在我的post方法中,我遵循了這個過程:

  1. 從頁面的字段中設置新報表實體的屬性。
  2. 從頁面的字段中設置SubReport實體的特定屬性。
  3. 將SubReport實體的報告設置為在1中創建的新報告實體。
  4. 給定頁面提供的ID,查找ReportSource並將Sub_Report實體的ReportSource設置為找到的實體。
  5. 保存更改。

這個工作流程成功完成了幾週。然後上週發生了一些變化,它不再起作用了。現在取代了保存操作,我得到了這個例外:

UpdateException: "Entities in 'DIR2_5Entities.ReportSourceSet' 
participate in the 'FK_ReportSources_ReportSourceTypes' relationship. 
0 related 'ReportSourceTypes' were found. 1 'Report_Source_Types' is expected."

調試可視化工具顯示以下內容:

  • SubReport的ReportSource已設置並加載,其所有屬性都是正確的。
  • Report_Source附加了一個有效的ReportSourceType實體。

在SQL事件探查器中,準備好的SQL語句看起來不錯。任何人都可以指出我錯過了哪些顯而易見的事情?

TIA

注意:在這種情況下,Report和SubReport始終是新實體。報表實體包含許多類型報表共有的屬性,用於通用查詢。子報告是具有不同類型的額外參數的特定報告。實際上每種類型的SubReport都有不同的實體集,但這個問題適用於所有這些,所以我使用SubReport作為簡化示例。

一般承認的答案

如果您的數據庫表彼此之間具有1 - 1的關係,則會發生這種情況。在您的示例中,reportsourceset需要一個帶有它引用的id的reportsorttypes。當我的關係將兩個主鍵從相對的錶鍊接在一起時,我遇到了這個問題。


熱門答案

我意識到我已經遲到了,但我遇到了類似的問題,在我提出解決方案之前,我已經整理了大約3個小時。我會發布代碼,但它在家裡 - 如果有人需要,我可以稍後再做。

以下是一些要檢查的事項:

  • 在SaveChanges()調用上設置斷點並深入檢查對像上下文。您應該看到上下文的添加和更改列表。當我第一次看時,我發現它試圖添加我所有相關的對象而不是僅指向它們。在您的情況下,上下文可能正在嘗試添加新的Report_Source_Type。
  • 與前一點相關,但如果您要檢索報告源,請確保通過其實體鍵從數據庫中檢索它並正確附加到上下文。如果沒有,您的上下文可能會認為它是一個新項目,因此不會設置其所需的關係。

從內存中,我使用context.GetObjectByKey方法檢索我的引用,然後使用context.Attach方法將這些對象顯式附加到上下文,然後將它們分配給原始對象的屬性。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因