考虑以下模型关系:
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);
目的是在B
和A
之间重用D
,但是EF Core为B
在表上创建了外键约束,这意味着我不能具有与A
关联而又不与B
关联的条目。
是否有一种方法来定义约束,以使约束存在于A
和D
上?
答案 0 :(得分:1)
这是一个数据库建模问题(不是EF核心),我们需要更多现实生活中的信息才能真正提供帮助。
尽管如此,外键已正确地从代码中放置在A
和D
上。所以问题是:子表是哪个表?在此处查看更广泛的答案:Where should I store a foreign key?
将FK放在错误的一侧,会危害数据的完整性。
您可以创建的唯一其他关系是B表上的两个键,这意味着要创建B
值,既需要A
也需要D
。