gpt4 book ai didi

c# - 防止一对多关系中的额外外键列

转载 作者:行者123 更新时间:2023-11-30 16:55:28 24 4
gpt4 key购买 nike

我正在尝试弄清楚如何配置 EF 来处理以下涉及一个 parent 和多个 child 的情况:

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 表上的唯一外键并防止添加额外的外键?

最佳答案

要解决此问题,您可以这样做:

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);

但对于您可能正在寻找的逻辑,此模型应该有效。

关于c# - 防止一对多关系中的额外外键列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29437581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com