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