Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止在一对多关系中出现额外的外键列_C#_Entity Framework_Ef Code First_Entity Framework 6_One To Many - Fatal编程技术网

C# 防止在一对多关系中出现额外的外键列

C# 防止在一对多关系中出现额外的外键列,c#,entity-framework,ef-code-first,entity-framework-6,one-to-many,C#,Entity Framework,Ef Code First,Entity Framework 6,One To Many,我试图找出如何配置EF以处理以下涉及一个家长和多个孩子的情况: public class Parent { public int ParentId {get; set;} [ForeignKey("SpecialChildOneId")] public virtual Child SpecialChildOne {get; set;} public int? SpecialChildOneId {get; set;} [ForeignKey("Spec

我试图找出如何配置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;}
}
公共类父类
{
public int ParentId{get;set;}
[外国钥匙(“特别儿童节”)]
公共虚拟子项SpecialChildOne{get;set;}
public int?SpecialChildOneId{get;set;}
[ForeignKey(“SpecialChildTwoId”)]
公共虚拟子特殊childtwo{get;set;}
public int?specialchildtwid{get;set;}
公共虚拟ICollection子项{get;set;}
}
公营儿童
{
public int ChildId{get;set;}
public int ParentId{get;set;}
}
为父类生成的表看起来很好。在我的子表上添加了两个额外的列:Parent\u ParentId和Parent\u ParentId1,并且ParentId上没有设置外键


如何强制ParentId成为子表上的唯一外键并防止添加其他外键?

要解决此问题,可以执行以下操作:

public class Child
{
   public int ChildId {get; set;}
   [ForeignKey("Parent")]
   public int ParentId {get; set;}
   public virtual Parent Parent{get;set;}
}
这样,子集合所涉及的关系与
ParentId
FK属性关联(这是创建
Parent\u ParentId 1
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);
modelBuilder.Entity()
.has可选(p=>p.SpecialChildOne)
.有很多
.HasForeignKey(p=>p.SpecialChildOneId);
modelBuilder.Entity()
.has可选(p=>p.SpecialChildTwo)
.有很多
.HasForeignKey(p=>p.SpecialChildTwoId);
modelBuilder.Entity()
.HasRequired(c=>c.Parent)
.有许多(p=>p.儿童)
.HasForeignKey(p=>p.ParentId);

但是对于您可能正在寻找的逻辑,此模型应该可以工作。

这几乎是完美的。唯一的问题是创建子对象并将其分配给parent.SpecialChildOne不会分配Child.ParentId外键。我还必须将子项添加到要分配的外键的parent.Children集合中。Hello@Brian,当您设置
SpecialChildOne
nav时。属性,将要设置的FK属性是
SpecialChildOneId
。FK
ParentId
属性属于另一个关系,因此,在将子对象添加到其父对象中的集合之前,此属性不会更改其值(请检查上次的Fluent Api配置)。