实体框架1到0或1关系配置

Raz*_*t4x 3 c# entity-framework

我有这门课

public class Parent
{
  [Key]
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual Child Child { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和一个儿童班

public class Child
{
  [Key]
  [ForeignKey]
  public int ParentId { get; set; }
  public string Name { get; set; }
  public virtual Parent Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这种关系使父母可以有0或1个孩子.我检查了SO并找到了两个解决方案.

modelBuilder.Configurations.Add(new ParentChildMap());

// solution 1
class ParentChildMap : EntityTypeConfiguration<Child>
{
    public ParentChildMap()
    {
        HasRequired(t => t.Parent).
            WithRequiredDependent(t => t.Child);    
    }
}

// solution 2
class ParentChildMap : EntityTypeConfiguration<Child>
{
    public ParentChildMap()
    {
         HasOptional(c => c.Parent)
            .WithRequired(c => c.Child);
    }
}
Run Code Online (Sandbox Code Playgroud)

事实是,他们都在工作!但问题是,我不确定哪一个是正确的.哪一个给我一个父母只能有0或1个孩子的映射.那么,另一个人说的是什么?

Iva*_*oev 7

让我们将相关实体添加到所需的关系及其基数:

父1 < - > 0..1孩子

你可以这样读它:

(1)- > 0..1 Child表示每个Parent可以有0或1个Child,换句话说,ChildParent实体的属性是可选的

(2)父母1 < -意味着每个孩子总是有1个父母,换句话说,实体的Parent财产Child必需的.

Child侧面对应的流畅配置是:

HasRequired(c => c.Parent).WithOptional(p => p.Child);
Run Code Online (Sandbox Code Playgroud)

或者从Parent旁边:

HasOptional(p => p.Child).WithRequired(c => c.Parent);
Run Code Online (Sandbox Code Playgroud)

这两个是正确的并完全等效 - 您可以使用一个或另一个,具体取决于您是否从Child(如样本中)或从中开始配置Parent.为了避免差异,不要两者都做.

为什么您当前的解决方案都不正确?

因为:

(解决方案1)

HasRequired(t => t.Parent).WithRequiredDependent(t => t.Child);
Run Code Online (Sandbox Code Playgroud)

表示父1 < - > 1子 关系(父亲必须始终有1个孩子).

(解决方案2)

HasOptional(c => c.Parent).WithRequired(c => c.Child);
Run Code Online (Sandbox Code Playgroud)

代表父0..1 < - > 1子关系(孩子可以有0或1个父母,父母必须总是1个孩子),即与你想要的相反.