我是不是需要使用 Fluent API 配置与实体框架的关系的双方?

Posted

技术标签:

【中文标题】我是不是需要使用 Fluent API 配置与实体框架的关系的双方?【英文标题】:Do I need to configure both sides of a relationship with Entity Framework with Fluent API?我是否需要使用 Fluent API 配置与实体框架的关系的双方? 【发布时间】:2017-02-02 09:00:53 【问题描述】:

我是 Fluent API 的新手。在我的场景中,Student 可以在一个Grade 中,而Grade 可以有多个Students。然后,这两个语句完成了同样的事情:

modelBuilder
.Entity<Student>()
.HasRequired<Grade>(s => s.Grade)
.WithMany(s => s.Students);

还有:

modelBuilder
.Entity<Grade>()
.HasMany<Student>(s => s.Students)
.WithRequired(s => s.Grade);

我的问题是 - 我应该如何选择一种陈述而不是另一种陈述?还是我需要这两个语句?

【问题讨论】:

【参考方案1】:

对于像你这样的双向关系(即两端都有导航属性时),没关系,你可以使用一个或另一个(你也可以同时使用,但不推荐因为它是多余的,可能导致两者不同步)。

当你有 单向 关系时,这真的很重要,因为只有 With 方法有无参数重载。

假设您没有Grade.Students 属性。那么你只能使用:

modelBuilder.Entity<Student>()
    .HasRequired(s => s.Grade)
    .WithMany();

如果你没有Student.Grade 属性,那么你只能使用:

modelBuilder.Entity<Grade>()
    .HasMany(s => s.Students)
    .WithRequired();

【讨论】:

我一直想知道,是否有充分的理由使用单向一对多(当它不是设计选择时)?换句话说,总是使用双向有缺点吗? @AhmedAbdelhameed 仅当物化实体实例用于数据传输时,序列化程序存在引用“循环”问题。但是无论如何,这种用法是不好的做法。 EF 本身对此没有任何问题,并且从建模/查询的角度来看,双向完美地代表了两端多重性的关系。 那么问题来了:我将在哪个实体上进行配置有关系吗?我认为在哪一方都没有关系,不是吗? @Eru 正如答案中提到的,如果两个实体都有导航属性,那没关系。否则它应该在具有导航属性的实体上。所有这些都适用于 EF6,在 EF Core 中,您可以配置来自任何实体的关系。【参考方案2】:

您只需要一个。这对于1 : M 关系来说已经绰绰有余了。

modelBuilder.Entity<Student>()
            .HasRequired<Grade>(s => s.Grade) //Student entity requires Grade 
            .WithMany(s => s.Students); //Grade entity includes many Students entities

【讨论】:

以上是关于我是不是需要使用 Fluent API 配置与实体框架的关系的双方?的主要内容,如果未能解决你的问题,请参考以下文章

使用 EF4.1 Fluent API 将具有导航属性的实体拆分为两个表

实体框架代码优先 - Fluent Api 与数据注释的优缺点 [关闭]

EF Core中通过Fluent API配置一对多关系

EF Core中通过Fluent API配置一对多关系

EF Core中通过Fluent API配置一对多关系

EF Core中通过Fluent API配置一对多关系