我是实体框架的新手,我已经阅读了asp.net EF 6 using MVC 5和其他网页几天了但是我很困惑,有点失去理解这些关系如何EF 6(代码优先)工作。
我不了解各种关系(1:1,1:n,n:n),什么是可选的,什么是强制性的?例如,asp.net网站说你必须拥有这种关系的外键和导航属性,除了导航属性的msdn page之外,它们是可选的。 (这样导航属性一般是可选的,但对于代码第一个工作流程它们是必要的吗?)
那么你真正感到非常高兴的是绘制一张表并告诉我每种关系,你如何在EF 6代码中首先定义它,什么是强制性的,什么是可选的以及什么是好处这个可选项目(我不能相信这样的基本事物在网络中不存在/很难找到)。如果你还可以发送一个参考资料,我可以先了解更多有关EF 6代码的信息(不是很长),它也会很棒。
答案 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);