首先是EF 6代码中的关系,什么是强制性的,什么是可选的以及为什么?

时间:2014-07-24 18:53:27

标签: database entity-framework ef-code-first entity-relationship

我是实体框架的新手,我已经阅读了asp.net EF 6 using MVC 5和其他网页几天了但是我很困惑,有点失去理解这些关系如何EF 6(代码优先)工作。

我不了解各种关系(1:1,1:n,n:n),什么是可选的,什么是强制性的?例如,asp.net网站说你必须拥有这种关系的外键和导航属性,除了导航属性的msdn page之外,它们是可选的。 (这样导航属性一般是可选的,但对于代码第一个工作流程它们是必要的吗?)

那么你真正感到非常高兴的是绘制一张表并告诉我每种关系,你如何在EF 6代码中首先定义它,什么是强制性的,什么是可选的以及什么是好处这个可选项目(我不能相信这样的基本事物在网络中不存在/很难找到)。如果你还可以发送一个参考资料,我可以先了解更多有关EF 6代码的信息(不是很长),它也会很棒。

1 个答案:

答案 0 :(得分:2)

msdn链接指出

  

您不必在实体类型上定义导航属性   该协会的另一端

这意味着您可以创建1:n关系

public class EntityA
{
    public virtual ICollection<EntityB> EntityBs { get; set; }
}

无需在EntityB上创建指向EntityA的导航属性。

我认为最好明确表达关系,以便在代码中传达您的意图。我这样做是通过在上下文类中指定OnModelCreating方法中的关系。

public class Context : DbContext 
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {
    }
}

在这种情况下,您要求指定的关系(实体EntityA和EntityB之间)成为:

<强> 1:1 请注意,这将通过同步主键而不是使用外键来创建数据库关系

modelBuilder.Entity<EntityA>()
    .HasRequired(x => x.EntityB)
    .WithRequiredPrincipal(x => x.EntityA);

<强> 0..1:N

modelBuilder.Entity<EntityB>().HasOptional(x => x.EntityA).WithMany();

<强> 1:N

modelBuilder.Entity<EntityB>().HasRequired(x => x.EntityA).WithMany();

<强> N:M

modelBuilder.Entity<EntityB>().HasMany(x => x.EntityA).WithMany(x => x.EntityB);