我先将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);
}
答案 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);
它使您也可以灵活地处理非必填字段。