簡體   English   中英

EF 6中的可選一對一關系

[英]Optional one to one relationship in EF 6

我首先使用帶有代碼的Entity Framework 6。

理想的情況是,用戶創建一個PrintType(例如“名片”),然后為該PrintType創建多個布局(例如“ Center”,“ Left”),最后他創建一個名為“帶花的名片”的模板。 他創建此模板后,程序應立即為該模板創建默認布局。

因此,應該有一個僅在它是模板的默認布局時才設置的可選FK。

我希望你能跟隨我。

當我想使用下面的代碼創建遷移時,出現以下錯誤:

無法確定類型“ xxx.Entities.Template”和“ xxx.Entities.Layout”之間的關聯的主要終點。 必須使用關系流利的API或數據注釋顯式配置此關聯的主要端。

public class PrintType
{
    public int Id { get; set; }
    public string Title { get; set; }

    public virtual ICollection<Template> Templates { get; set; }
    public virtual ICollection<Layout> Layouts { get; set; }
}

public class Layout
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Required]
    public virtual PrintType PrintType { get; set; }
    public Template Template { get; set; }
}

public class Template
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Required]
    public virtual PrintType PrintType { get; set; }

    [Required]
    public Layout Layout { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Layout>().HasOptional(a => a.Template).WithOptionalDependent().WillCascadeOnDelete(false);
    }

如果我關注您,則需要Fluent API中的一個關系,該關系使您的外鍵成為可選項,在DbContext類中,您可以使用FluentAPI來完成此操作,如下所示:

方法1:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<A>()
            .HasOptional(a => a.MyB)
            .WithOptionalDependent()
            .WillCascadeOnDelete(true); // or false depends
    }

方法2:

如果要在代碼中設置默認模板和Layout,則可以將依賴項設置為required。 您可以通過在您的依賴端上放置Required注釋來完成此操作,如下所示:

public class Layout
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Required]
    public virtual PrintType PrintType { get; set; }
    public Template Template { get; set; }
}

public class Template
{
    public int Id { get; set; }
    public string Title { get; set; }

    [Required]
    public virtual PrintType PrintType { get; set; }
    [Required]
    public Layout Layout { get; set; }
}

和您的Fluent API代碼,以避免級聯刪除問題:

modelBuilder.Entity<Child1>()
    .HasRequired(c => c.navigationpropertyhere)
    .WithMany()
    .WillCascadeOnDelete(false);

modelBuilder.Entity<Child2>()
    .HasRequired(s => s.navigationpropertyhere)
    .WithMany()
    .WillCascadeOnDelete(false);

它也使您可以靈活地處理非必填字段。

暫無
暫無

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

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