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