2012-07-22 66 views
1

我已經使用POCO構建了我的模型。當我開始播種我的數據庫時,我得到:錯誤播種數據庫,外鍵問題

無法確定'CSP.Models.Type_Color'關係的主體結束。多補充實體可能具有相同的主鍵

這裏的模型問題:

public class Type 
{ 
    [Key] 
    [ScaffoldColumn(false)] 
    public int TypeId { get; set; } 

    [Required(ErrorMessage = "A Type Name is Required")] 
    [Display(Name="Type")] 
    public string Name { get; set; } 

    public int ColorId { get; set; } 
    public bool Other { get; set; } 

    //Navigations 
    [ForeignKey("ColorId")] 
    public virtual Color Color { get; set; } 
    public virtual List<Tools> tools { get; set; } 

} 

public class Color 
{ 
    [Key] 
    [ScaffoldColumn(false)] 
    public int ColorId { get; set; } 

    [Required(ErrorMessage = "A name is required")] 
    public string Name { get; set; } 

    public string Description { get; set; } 

    //navigation 
    public virtual List<Type> Types { get; set; } 
} 

大多數標記我讀的建議後所做的。

所得到的錯誤

我的種子代碼是在這裏:

var colors = new List<Color> 
     { 
      new Color{Name="Red"}, 
      new Color{Name="White"} 
     }; 

      var types = new List<Type> 
     { 
      new Type{ Name="Hammer", Color = colors.Where(ws => ws.Name=="Red").Single()}, 
      new Type{ Name= "Electric", Color = colors.Where(ws => ws.Name=="Red").Single()} 
     }; 

new List<Tool> 
     { 
      new Wine{ Maker= Maker.Single(v => v.Name=="HammerCo"), Type= types.Single(wt => wt.Name=="hammer")}, 
     } 
     }.ForEach(a => context.Tools.Add(a)); 
      context.SaveChanges(); 

我也嘗試添加每個值範圍內,然後保存。在嘗試保存類型實體後,我得到了這個錯誤:

[System.Data.SqlClient.SqlException] = {「INSERT語句與FOREIGN KEY約束衝突」Type_Color \「衝突發生在數據庫\」 TestTools \「,table \」dbo.Colors \「,'ColorId'列。\ r \ n聲明已終止。」}

我錯過了什麼?

+0

你拼寫爲「錘」沒有大寫的H第二次除此之外,嘗試使ColorID爲int?('Nullable ') – Dabblernl 2012-07-22 19:27:07

回答

5

發生了什麼事情是你的對象的主鍵都有默認的int值(0)。當你將它們添加到上下文中時,EF檢測到這一點並引發一個錯誤(兩個相同類型的對象不能有相同的鍵值,在本例中爲0.我假設數據庫中的主鍵字段被設置爲IDENTITY列,並且將在插入自動遞增+1。這聽起來可能有些奇怪,但你需要給你的對象佔位符,這將在插入時被替換爲IDENTITY值的ID。

new Color{ColorId = 1, Name="Red"}, 
new Color{ColorId = 2, Name="White"} 
new Type{TypeId = 1, Name="Hammer", ...} 
new Type(TypeId = 2, Name="Electric", ...} 
+0

這樣做!看起來很奇怪,它似乎在我將顏色表添加到混合中之前自動處理ID,但強制它在工作中。 – Snowburnt 2012-07-23 00:33:55

+1

謝謝,你的回答幫助我用db背景爲我的新數據庫播種 – 2013-02-03 20:39:58

+0

和我!這個技巧並不需要簡單的兩個表結構,但是當我添加更復雜的輔助關係時,db上下文種子處理失去了方法。 – Xcheque 2013-07-05 23:50:37