【问题标题】:How to make a relationship be required in EF code first如何首先在 EF 代码中建立关​​系
【发布时间】:2012-01-04 03:44:44
【问题描述】:

我有一个 EF Code First 一对多关系。它本质上是一种父/子关系,因为没有父母,孩子就无法存在。

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; }
}

所以我不确定如何让孩子必须有一个父母,所以我尝试在其上添加一个 [Required] 属性。这给了我错误:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好的,但是像这样的简单关系如何有多个级联路径的危险?
    • @IngóVals:我不知道。我已经使用您的代码 sn-ps 和您的附加描述测试了您的模型“父对象还有其他子对象,这些子对象与原始子对象共享多对多关系”。但我根本没有得到这个级联删除异常。可能我创建的模型与您所拥有的关系并不完全相同。我认为您必须显示完整模型(包括OtherChild 实体)才能找到异常的真正原因。
    猜你喜欢
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    相关资源
    最近更新 更多