防止一对多关系中的额外外键列
Prevent extra foreign key columns in One to Many relationship
我正在尝试弄清楚如何配置 EF 以处理以下涉及一个 parent 和多个 children:
的情况
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 class 生成的 table 看起来不错。在我的 child table 上,尽管我添加了两个额外的列,Parent_ParentId 和 Parent_ParentId1,并且没有在 ParentId 上设置外键。
如何强制 ParentId 成为 Child table 上的唯一外键并防止添加其他外键?
要解决此问题,您可以这样做:
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);
但对于您可能正在寻找的逻辑,此模型应该有效。
我正在尝试弄清楚如何配置 EF 以处理以下涉及一个 parent 和多个 children:
的情况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 class 生成的 table 看起来不错。在我的 child table 上,尽管我添加了两个额外的列,Parent_ParentId 和 Parent_ParentId1,并且没有在 ParentId 上设置外键。
如何强制 ParentId 成为 Child table 上的唯一外键并防止添加其他外键?
要解决此问题,您可以这样做:
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);
但对于您可能正在寻找的逻辑,此模型应该有效。