1

我有兩個表格Plants and Information。每個工廠都有很多信息,但每個工廠都有一個MainInformation。所以兩者之間有一對多的關係和一對一的關係。信息表有一個PlantID,Plants表有一個MainInformationID。我希望兩個表中的兩個字段都不是空值。但是現在你不能將兩個記錄中的任何一個插入到它們的表中,因爲每個記錄都要求它們的字段不爲空,這意味着它們需要先創建另一個記錄才能創建它們自己。也許這不是一個好的數據庫設計,應該改變什麼? (我是新的數據庫和實體框架)數據庫雙連接關係插入問題

我試圖插入到數據庫本身手動,但我不能這樣做。我也用EntityFramework試過這段代碼。

using (var context = new MyEntities()) 
     { 
      var p = new Plant() 
      { 
       LatinName = "latinNameTest", 
       LocalName = "localNameTest", 
       CycleTime = 500 
      }; 

      var i = new Information() 
      { 
       ShortDescription = "ShortDesc", 
       LongDescription = "LongDesc" 
      }; 

      p.MainInformation = i; 
      i.Plant = p; 

      context.AddToPlants(p); 
      context.AddToInformation(i); 

      context.SaveChanges();     
     } 

回答

2

一個

  • 1-1 FK列必須是NULL
  • 的FK已被禁用,讓孩子之前
  • 您必須使用單獨的虛擬信息行父插入默認情況下,在佛羅里達州的列

SQL Server不允許遞延約束,而無需「代碼更改」權限,以便即使在交易包將無法正常工作

檢查

聽起來像一個EAV架構,它有其他問題

+0

我要去第一個選項,我也考慮過第三個選項,但我們沒有跟它一起去。我對你提到的第二個選項感興趣。可以多解釋一下如何做到這一點? – synepis 2010-03-08 14:03:46

+0

ALTER TABLE MyTable NOCHECK CONSTRAINT FK ... http://msdn.microsoft.com/en-us/library/ms190273(SQL.90).aspx – gbn 2010-03-08 16:57:03

+0

此外,我在這裏回答:http://stackoverflow.com/questions/737115 /關閉約束-暫時/ 737167#737167 – gbn 2010-03-08 17:50:00

2

您需要更改表以允許爲空。沒有其他辦法可以做到這一點。

+0

無論如何這兩個表中的一個。改變需求可能是一個好主意,因此只能將信息添加到工廠,但工廠只能將主要信息分配給其現有信息記錄之一。 – 2010-03-07 13:03:43

+0

@downvoter:隨時解釋。 – Hogan 2010-03-07 13:22:55

+0

我不是下來的選民,但我認爲你的答案事實上是不正確的。 @gbn給出了一些其他的選擇,第四種是將關係分解成單獨的表。 – 2010-03-08 14:18:53

0

您可能想查看數據庫事務以及如何將它們與實體框架結合使用。您可以將兩個INSERTS包裝到單個數據庫事務中,因此唯一的結果是它們都進入或不進入。

Here是使用EF的事務的鏈接。我沒有通讀它,但它似乎談論他們足以讓你開始。

+1

這將無法正常工作,因爲FK在交易中的每個對賬單都被檢查過 – gbn 2010-03-07 16:36:32