1

我有EF代碼首先一對多關係。它本質上是父母/子女的關係,因爲孩子沒有父母就不能生存。如何在EF代碼中首先需要關係

public class Parent 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public virtual ICollection<Child> Children { get; set; } 

    public virtual ICollection<OtherChild> OtherChildren { get; set; } 
} 

public class Child 
{ 
    [Key] 
    public Guid Id { get; set; } 

    public virtual Parent Parent { get; set; } 
} 

所以我不知道我怎麼可能有孩子需要有一個家長,所以我試圖把一個[必需]屬性就可以了。這給了我錯誤:

- InnerException {"Introducing FOREIGN KEY constraint 'Child_Parent' on table 'Child' 
    may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE 
    NO ACTION, or modify other FOREIGN KEY constraints.\r\nCould not create constraint. 
    See previous errors."} 
    System.Exception {System.Data.SqlClient.SqlException} 

好吧我不知道他如何可以有多個級聯部分。

父母也有其他子對象,這些子對象與原始子對象共享多對多關係,但不應該需要級聯刪除。

我想我做錯了,但是做到這一點的正確方法是什麼。

PS。當我有一個孩子需要一個家長,我應該使外鍵成爲主鍵的一部分?

回答

2

您可以禁用級聯刪除在流利的API的關係(這是不可能用數據說明):

public class MyContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Parent>() 
      .HasMany(p => p.Children) 
      .WithRequired(c => c.Parent) 
      .WillCascadeOnDelete(false); 
    } 
} 

您必須刪除然後兒童以及在你的代碼,如果你刪除父。

您不需要創建主鍵的外鍵部分,我也沒有看到這樣做的好處。您的Guid鍵已經是唯一的。如果您在數據庫的外鍵列上創建索引,它將有助於查詢性能。

+0

好吧,但像這樣的簡單關係會有多個級聯路徑的危險嗎? –

+0

@IngóVals:我不知道。我用你的代碼片段和你的附加描述測試了你的模型*「父類也有其他子對象,這些子對象與原始子對象」*「共享多對多關係。但是我根本沒有得到這個級聯刪除例外。可能我創建的模型不完全符合您擁有的相同關係。我認爲你必須展示完整模型(包括'OtherChild'實體)才能找到異常的真正原因。 – Slauma