首先如何在EF代码中建立关​​系

时间:2011-11-22 18:56:15

标签: entity-framework-4.1 foreign-keys ef-code-first one-to-many

我有一个EF Code First One-To-Many关系。它本质上是一个父/子关系,因为没有父母,孩子就不能存在。

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。当我有一个孩子需要父母时,我应该将外键作为主键的一部分吗?

1 个答案:

答案 0 :(得分:2)

您可以为Fluent 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密钥已经是唯一的。如果您在数据库中的外键列上创建索引,它将有助于查询性能。