[英]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.