EF 6中的可选一对一关系

时间:2018-07-18 06:19:37

标签: c# entity-framework entity-framework-6

我先将Entity Framework 6和代码一起使用。

理想的情况是,用户创建一个PrintType(例如“名片”),然后为该PrintType创建多个布局(例如“ Center”,“ Left”),最后他创建一个名为“ Business Card with”的模板。花卉”。他创建此模板后,程序应立即为该模板创建默认布局。

因此应该有一个可选的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);
    }

1 个答案:

答案 0 :(得分:0)

如果我关注您,则需要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:

,如果要在代码中设置默认模板和“布局”,则可以将相关项设置为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);

它使您也可以灵活地处理非必填字段。