2012-02-23 71 views
0

在重寫DatabaseInitializer的「Seed」方法時,我已經將一些項目添加到上下文中,但我得到了參考完整性錯誤,我推測因爲項目正在被添加以錯誤的順序到數據庫。訂單如何定義?EF代碼優先:嵌入項目的插入順序

在生成db之後,我可以使用原始SQL將項目添加到數據庫,因此我不認爲數據有任何問題。

E.g.

  new List<PropertyType> 
      { 
       new PropertyType {Name = "Text"}, 
       new PropertyType {Name = "Colour"}, 
       new PropertyType {Name = "Image"} 
      }.ForEach(e => context.PropertyTypes.Add(e)); 

     base.Seed(context); 

     new List<Property> 
      { 
       new Property {Name = "font", PropertyTypeId = 1}, 
       new Property {Name = "colour", PropertyTypeId = 2}, 
       new Property {Name = "background-image", PropertyTypeId = 3} 
      }.ForEach(e => context.Properties.Add(e)); 

     base.Seed(context); 

我可以運行它自己的第一個種子,它的工作原理。第二顆種子引起參照完整性錯誤。完全簡單的關係。

public class Property 
{ 
    [Key] 
    public int PropertyId { get; set; } 

    [Required, StringLength(100)] 
    public string Name { get; set; } 

    [Required] 
    public int PropertyTypeId { get; set; } 
    public PropertyType PropertyType { get; set; } 
} 

public class PropertyType 
{ 
    [Key] 
    public int PropertyTypeId { get; set; } 

    [Required, StringLength(50)] 
    public string Name { get; set; } 

    public IList<Property> Properties { get; set; } 
} 
+0

什麼是'base.Seed'? – 2012-02-23 12:46:04

+0

它調用基類版本的種子。我試着把它拿出來。沒什麼區別。我認爲我在某處讀取它調用它可以捕獲上述代碼中的錯誤,但我不認爲它是這樣做的。 – 2012-02-23 12:51:00

+0

這取決於什麼初始值設定項是您的父類。默認初始值設定項使此方法爲空。 「二次種子」又是什麼意思?這兩部分是一起執行的嗎? – 2012-02-23 13:13:11

回答

2

不正是我一直在尋找,但這個工程籽RAW SQL數據...

  new List<PropertyType> 
      { 
       new PropertyType 
        { 
         Name = "Text", 
         Properties = new List<Property> {new Property {Name = "font"}} 
        }, 
       new PropertyType 
        { 
         Name = "Colour", 
         Properties = new List<Property> {new Property {Name = "color"}} 
        }, 
       new PropertyType 
        { 
         Name = "Image", 
         Properties = new List<Property> {new Property {Name = "background-image"}} 
        } 
      }.ForEach(e => context.PropertyTypes.Add(e)); 
0

插入順序由您的模型定義。如果在數據庫中有參照約束,則必須正確設置模型以反映關係中的這些約束(導航屬性),否則EF不知道這些約束。

您可以通過使用context.Database.ExecuteSqlCommand

+0

嗯,我不相信它的工作原理,並在播種後運行context.Database.ExecuteSqlCommand並得到了類似的錯誤。很難知道錯誤是什麼,因爲異常是非常通用的。 – 2012-02-23 12:31:40

+0

噢,是的,我發現Sql異常及其引用完整性錯誤。 – 2012-02-23 12:41:25