EF核心3:反向外键关系

时间:2020-08-21 07:40:00

标签: c# .net-core entity-framework-core ef-code-first ef-core-3.1

考虑以下模型关系:

public class A
{
    [Key]
    public int Id { get; set; }
    public int BId { get; set; }
    public ICollection<B> Bs { get; set; }
}

public class D
{
    [Key]
    public int Id { get; set; }
    public int BId { get; set; }
    public ICollection<B> Bs { get; set; }
}

public class B
{
    public int Id { get; set; }
    public int CId { get; set; }
    public C C { get; set; }
}

public class C
{
    [Key]
    public int Id { get; set; }
}

使用此配置:

modelBuilder.Entity<B>()
    .HasKey(x => new { x.Id, x.CId });

modelBuilder.Entity<A>()
    .HasMany(a => a.Bs)
    .WithOne()
    .HasForeignKey(b => b.Id)
    .HasPrincipalKey(a => a.Id);

modelBuilder.Entity<D>()
    .HasMany(a => a.Bs)
    .WithOne()
    .HasForeignKey(b => b.Id)
    .HasPrincipalKey(a => a.Id);

目的是在BA之间重用D,但是EF Core为B在表上创建了外键约束,这意味着我不能具有与A关联而又不与B关联的条目。

是否有一种方法来定义约束,以使约束存在于AD上?

1 个答案:

答案 0 :(得分:1)

这是一个数据库建模问题(不是EF核心),我们需要更多现实生活中的信息才能真正提供帮助。

尽管如此,外键已正确地从代码中放置在AD上。所以问题是:子表是哪个表?在此处查看更广泛的答案:Where should I store a foreign key?

将FK放在错误的一侧,会危害数据的完整性。

您可以创建的唯一其他关系是B表上的两个键,这意味着要创建B值,既需要A也需要D