2009-08-17 14 views
3

我正在使用ADO.NET實體框架構建ASP.NET MVC網站。 我有包括這些實體的實體模型,由外鍵關聯:實體框架不會在具有兩級關係的新實體上進行SaveChanges

報告(編號,日期,標題,Report_Type_ID等)

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

沒有爲每種類型的子報表的Create.aspx頁。後事件方法返回一個新的Sub_Report實體。

之前,在我的崗位的方法,我遵循了這一過程:

  1. 設置屬性與網頁的領域一個新的報告實體。
  2. 從頁面的字段中設置SubReport實體的特定屬性。
  3. 設置子報表實體的報告在1
  4. 鑑於該頁面提供的ID創建的新報告實體,仰望ReportSource和Sub_Report實體的ReportSource已找到的實體。
  5. SaveChanges。

該工作流程在幾個星期內成功完成。然後在上個星期發生了一些變化,並且它不再工作。現在,而不是保存操作,我得到這個異常:

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

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

  • 子報表的ReportSource設置和加載,並且它的所有屬性都是正確的。
  • Report_Source具有附加的有效ReportSourceType實體。

在SQL事件探查器中,準備好的SQL語句看起來很好。任何人都可以指出我缺少什麼明顯的東西嗎?

TIA

注: 報告和子報表總是在這種情況下,新的實體。 報表實體包含許多類型報表的常用屬性,用於通用查詢。 SubReports是特定的報告,其中的額外參數因類型而異。實際上爲每種類型的SubReport設置了不同的實體集,但是這個問題適用於所有這些實體,因此我使用SubReport作爲簡化示例。

+0

你可能想給一個代碼片段,它肯定會幫助我弄清楚是怎麼回事。通常這樣的問題通過一些代碼很容易看到。 – 2009-08-18 05:39:56

+0

謝謝你的迴應,亞歷克斯。我會盡量在稍後發佈一些代碼。現在,我只是將它標記爲EF爲1.0,並用存儲過程替換了我的代碼。 – 2009-08-18 18:24:47

回答

0

如果您的數據庫表彼此具有1 - 1的關係,那麼這往往會發生。在您的示例中,reportsourceset期望使用所引用的任何id的報告類型。當我的關係將來自對立表的兩個主鍵鏈接在一起時,我遇到了這個問題。

+0

我剛剛刪除了自聯接和插入工作。這是否會在整體計劃中起作用? – Rod 2011-09-29 18:45:26

1

檢查您的ReportSource是否加載了NoTracking選項或者它的EntityState =='Detached'。如果是這樣,那是你的問題,它必須在上下文中加載。

+0

感謝您的評論。我已經在調試模式下檢查了EntityState,但沒有檢測到NoTracking選項。我確實嘗試了你的評論,並沒有喜悅。 我也重新生成了我的模型,以查看上次更新是否導致了問題,但沒有什麼區別。爲了解決這個問題,我只寫了一個存儲過程來清理所有相關對象並刪除實體。 – 2009-08-20 15:24:40

6

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

這裏有一些事情要檢查:

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

從存儲器,I使用context.GetObjectByKey方法檢索我的參考,然後將其分配給我的原始對象的屬性之前明確地附接這些對象使用context.Attach方法的上下文。

+0

添加和更改列表可以使用Visual Studio DataTip找到(在與下面類似的行上設置一個斷點並將鼠標懸停在ObjectContext部分上)。 this.ObjectContext.SaveChanges()。 在數據提示,深入到「_addedEntityStore」通過...... 基地{System.Data.Objects.ObjectContext} - > ObjectStateManager - > 非公共成員 - > _addedEntityStore – mathijsuitmegen 2010-04-06 10:12:53

+0

這就是我做什麼,當我」 m在調試中運行。在我的情況下,對運行時屬性的檢查顯示所有數據都已到位,所有密鑰都已填充且正確。我認爲外匯基金並沒有把事情跟蹤到人們預期的水平。我發佈時很匆忙,因此我決定使用存儲過程來處理複雜的實體樹。 – 2010-04-07 14:56:46

+0

嗨,我想我遇到了你正在描述的有關添加對象而不是指向它們的問題(我不斷地在數據庫中獲取新的國家實體,當我實際上試圖在其他實體中引用它們時.. )我如何指向一個實體,而不是添加一個新實體?他們似乎當我這樣做是爲了添加: 'CountryRepresentation代表=新CountryRepresentation(){ 公司 =公司, 國家= MiscRepository.GetCountry(Int32.Parse(國家)) };' 並保存它。 。? – 2011-06-23 13:43:13

0

我得到了同樣的錯誤,因爲在「添加」狀態下創建「幕後」的新對象實例。這並不明顯。

+0

它肯定不明顯。在我的情況下,我正在編寫由其他人維護的工具,我不能良心處理這種情況讓他們處理,所以我將任務分解爲複雜實體的存儲過程。 – 2010-04-07 14:59:04

2

我得到這個錯誤,因爲表沒有主鍵,它有一個FK參考,但沒有PK。

添加PK並更新模型後,一切正常。

0

當我將新實體添加到上下文但忘記將新實體添加到其父對象圖中的集合時,出現此錯誤。

例如:

Pet pet = new Pet(); 
context.Pets.Add(pet); 
// forgot this: petOwner.Pets.Add(pet);