0

我很难维持父类与其子类之间的多重关系。谁能告诉我为什么我可以在父级中创建两个子引用而不是第三个?下面的代码仅在第三个引用被注释掉时才有效。

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Child1Id { get; set; }
    public Child Child1 { get; set; }
    public int Child2Id { get; set; }
    public Child Child2 { get; set; }
    //public int Child3Id { get; set; }
    public Child Child3 { get; set; }
    public ICollection<Child> Children { get; set; }
}
public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ParentId { get; set; }
    public Parent Parent { get; set; }
}
public class CFContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
    public DbSet<Child> Children { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Child>()
            .HasRequired(c => c.Parent)
            .WithRequiredPrincipal(p => p.Child1)
            .WillCascadeOnDelete(false);

        modelBuilder.Entity<Child>()
         .HasRequired(c => c.Parent)
         .WithRequiredPrincipal(p => p.Child2)
         .WillCascadeOnDelete(false);

        //modelBuilder.Entity<Child>()
        // .HasRequired(c => c.Parent)
        // .WithRequiredPrincipal(p => p.Child3)
        // .WillCascadeOnDelete(false);
    }
}
4

1 回答 1

1

看起来您正在尝试建立从父实体到子实体的一对多关系。在这种情况下,代码应如下所示:

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Child> Children { get; set; }
}
public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ParentId { get; set; }
    public Parent Parent { get; set; }
}

只要您遵循有关导航属性和外键命名的默认约定,就不必在 Fluent API 中指定关系。您将不得不使用 Fluent API 和/或属性来配置您使用非常规名称的关系,例如重命名 ParentId 其他一些东西需要您在 [ForeignKey("Parent")] 属性中标记它。

使用 Fluent API 的最常见用例是禁用级联删除(无法使用属性执行此操作)。

于 2012-08-21T20:48:32.000 回答