簡體   English   中英

實體框架1到0或1關系配置

[英]Entity Framework 1 to 0 or 1 relationship configuration

我有這門課

public class Parent
{
  [Key]
  public int Id { get; set; }
  public string Name { get; set; }
  public virtual Child Child { get; set; }
}

和一個兒童班

public class Child
{
  [Key]
  [ForeignKey]
  public int ParentId { get; set; }
  public string Name { get; set; }
  public virtual Parent Parent { get; set; }
}

這種關系使父母可以有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);
    }
}

事實是,他們都在工作 但問題是, 我不確定哪一個是正確的。 哪一個給我一個父母只能有0或1個孩子的映射。 那么,另一個人說的是什么?

讓我們將相關實體添加到所需的關系及其基數:

父1 < - > 0..1孩子

你可以這樣讀它:

(1) - > 0..1 Child表示每個Parent可以有0或1個Child,換句話說, Parent實體的Child屬性是可選的

(2) 父1 < -表示每個子節點總是有1個父節點,換句話說, 需要 Child實體的Parent屬性。

Child方面相對應的流暢配置是:

HasRequired(c => c.Parent).WithOptional(p => p.Child);

或者從Parent方那里:

HasOptional(p => p.Child).WithRequired(c => c.Parent);

這兩個是正確的並完全等效 - 您可以使用一個或另一個,具體取決於您是從Child (如樣本)還是從Parent啟動配置。 為了避免差異,不要兩者都做。

為什么您當前的解決方案都不正確?

因為:

(解決方案1)

HasRequired(t => t.Parent).WithRequiredDependent(t => t.Child);

表示父1 < - > 1子關系(父親必須始終有1個孩子)。

(解決方案2)

HasOptional(c => c.Parent).WithRequired(c => c.Child);

代表父0..1 < - > 1子關系(孩子可以有0或1個父母,父母必須總是1個孩子),即與你想要的相反。

事實是,他們都在工作! 但問題是,我不確定哪一個是正確的?

是! 你的兩種方法都是不正確的(信用轉到Ivan Stoev)。 因為:

你的解決方案1:

HasRequired(t => t.Parent).WithRequiredDependent(t => t.Child);

表示父1 < - > 1子關系(父親必須始終有1個孩子)。

你的解決方案2:

HasOptional(c => c.Parent).WithRequired(c => c.Child);

代表父0..1 < - > 1子關系(孩子可以有0或1個父母,父母必須總是1個孩子),即與你想要的相反。

您的Fluent API應如下所示:

modelBuilder.Entity<Parent>()
                .HasOptional(p => p.Child) // Mark Child property optional in Parent entity
                .WithRequired(c => c.Parent); // mark Parent property as required in Child entity. Cannot save Child without Parent

此外,您還可以使用Data Annotation配置One-to-One或One-to-Zero關系,如下所示:

子類應如下:

public class Child
{
  [Key,ForeignKey("Parent")]
  public int ParentId { get; set; }
  public string Name { get; set; }
  public virtual Parent Parent { get; set; }
}

你不需要修飾ForeignKey屬性。 如果你想要一個1到0的關系,關系的一邊必須是可選的(例如:HasOptional),如下面的代碼:

public class Parent
{
   [Key]
   public int Id { get; set; }
   public string Name { get; set; }
   public virtual Child Child { get; set; }
}

public class Child
{
   [Key]
   public int Id { get; set; }
   public string Name { get; set; }
   public virtual Parent Parent { get; set; }
}



public class ParentMap : EntityTypeConfiguration<Parent>
{
    public ParentMap ()
    {
        HasOptional(t => t.Child).WithRequired(t => t.Parent);
    }
}

現在,當您向數據庫添加新父項時,不需要添加子項,因為它是可選項,但是當您要將新子項添加到數據庫時,子項Id必須與父項Id相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM