2011-05-13 74 views
10

我試圖先用代碼和流利的API來創建一個對象,該對象包含來自同一個表的兩個不同實體。換句話說,轉移對象可以提供兩個不同的坦克對象 - 一個是來源,另一個是目的地。從一個對象到兩個相同實體類型的對象的多個關聯

但是,當我使用下面的代碼時,我得到一個異常,指出「引用關係將導致不允許的循環引用」。

modelBuilder.Entity<Transfer>() 
      .HasRequired<Tank>(t => t.Source) 
      .WithMany(t => t.OutboundTransfers); 
modelBuilder.Entity<Transfer>() 
      .HasRequired<Tank>(t => t.Destination) 
      .WithMany(t => t.InboundTransfers); 

我最好的猜測是它認爲我指向兩個鍵到同一坦克?任何想法我可以做到這一點?

編輯:找到答案,因爲從Entity Framework Code First - two Foreign Keys from same table

+2

是的,當兩個導航屬性指向同一個表時,您不能讓EF 4.1啓用級聯刪除約束。要啓用適當的約束,您需要使用Seeding對象手動將它們添加到數據庫中以執行適當的腳本。 – 2011-05-17 11:54:21

+0

就是這樣,就像你發現的那樣,亞歷山大也指出。在MSSMS上手動執行它將引發錯誤「無法創建關係(...)可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 – 2012-09-18 22:42:11

+1

您可以將您的解決方案作爲答案加以標記嗎? – sinelaw 2012-10-17 01:26:10

回答

1

正如你所說添加.WillCascadeOnDelete(假的),你應該能夠添加.WillCascadeOnDelete(false) - https://stackoverflow.com/a/5559300/5416

modelBuilder.Entity<Transfer>() 
     .HasRequired<Tank>(t => t.Source) 
     .WithMany(t => t.OutboundTransfers) 
     .WillCascadeOnDelete(false); 
modelBuilder.Entity<Transfer>() 
     .HasRequired<Tank>(t => t.Destination) 
     .WithMany(t => t.InboundTransfers) 
     .WillCascadeOnDelete(false); 

我只是說這個答案讓它不會顯示在沒有答案的列表上,因爲沒有回答沒有答案。標記爲社區wiki :)

0

像往常一樣拉迪斯拉夫(EF Guru)有EF問題的答案。 (謝謝拉迪斯拉夫) 只是一個替代我發現有用。 我有第二個解決方案,我並行運行。 如果我每個人都有一個代碼的第一個問題。我第一次嘗試thi: 反向工程師編碼的第一個解決方案。(來自EF電動工具)

我有一個測試DB,我在手動添加所需的概念在數據庫中。 我仍然發現在數據庫中這樣做更直觀,因爲我是第一次編寫代碼。 然後使用powertool http://visualstudiogallery.msdn.microsoft.com/72a60b14-1581-4b9b-89f2-846072eff19d

在項目/解決方案上右鍵單擊實體框架,反向工程DB首先編碼。

查看它生成的代碼。你會得到一個如何做事的例子。

相關問題