我试图弄清楚如何配置EF来处理涉及一个父母和多个孩子的以下情况:
public class Parent
{
public int ParentId {get; set;}
[ForeignKey("SpecialChildOneId")]
public virtual Child SpecialChildOne {get; set;}
public int? SpecialChildOneId {get; set;}
[ForeignKey("SpecialChildTwoId")]
public virtual Child SpecialChildTwo {get; set;}
public int? SpecialChildTwoId {get; set;}
public virtual ICollection<Child> Children {get; set;}
}
public class Child
{
public int ChildId {get; set;}
public int ParentId {get; set;}
}
我父类的生成表看起来很好。在我的子表上虽然我添加了两个额外的列,Parent_ParentId和Parent_ParentId1,并且没有在ParentId上设置外键。
如何强制ParentId成为Child表中唯一的外键并阻止添加其他外键?
答案 0 :(得分:2)
要解决此问题,您可以执行以下操作:
public class Child
{
public int ChildId {get; set;}
[ForeignKey("Parent")]
public int ParentId {get; set;}
public virtual Parent Parent{get;set;}
}
这样,涉及子集合的关系与ParentId
FK属性相关(这是创建Parent_ParentId1
FK列的关系。)
现在,你可能认为你有两个一对一的关系和一个一对多的关系,但事实并非如此,你真的有三个一对多的关系(前两个有单向导航) 。如果您使用Fluent Api配置这些关系,它将是这样的:
modelBuilder.Entity<Parent>()
.HasOptional(p=> p.SpecialChildOne )
.WithMany()
.HasForeignKey(p=> p.SpecialChildOneId );
modelBuilder.Entity<Parent>()
.HasOptional(p=> p.SpecialChildTwo )
.WithMany()
.HasForeignKey(p=> p.SpecialChildTwoId );
modelBuilder.Entity<Child>()
.HasRequired(c=> c.Parent)
.WithMany(p=>p.Children)
.HasForeignKey(p=> p.ParentId);
但是对于你可能正在寻找的逻辑,这个模型应该有用。