【问题标题】:Can Entity Framework handle many to many relationship without an intersection object?实体框架可以在没有交集对象的情况下处理多对多关系吗?
【发布时间】:2012-11-27 16:23:12
【问题描述】:

使用数据库优先模型:假设我们有经典表 StudentCourseStudentCourse(后者显然对 StudentCourse 有 FK)。

如果将此模型导入 EF,您将获得为每个模型生成的对象。 StudentCourse 类将分别有一个 StudentCourses 的集合,您需要从中跳转另一个关系以分别到达 CourseStudent

我希望生成的代码使得底层交集表不可见,即Student 有一个Courses 的集合,Course 有一个Students 的集合。我已经在其他 ORM 软件(特别是TopLink)中看到了这一点。可以在EF中完成吗?

【问题讨论】:

  • 所以只豁免table1table2 模型?
  • 代码优先当然可以,所以我认为数据库优先也可以。
  • 您的StudentCourses 表是否还有其他列?这篇文章似乎建议你如果没有得到想要的行为:learnentityframework.com/LearnEntityFramework/tutorials/…
  • @RichardDeeming - 嗯,我没有任何其他有意义的列,但我有一个单独的自动编号 ID 字段。严格来说,如果有必要,我可以进行复合 PK 并删除 ID 字段...
  • 根据我的阅读,删除该列是可行的。无论如何,复合 PK 通常是此类表的更好选择。

标签: c# entity-framework entity-framework-5 ef-database-first


【解决方案1】:

根据this tutorial,如果您的StudentCourse 表仅包含外键列,您将获得所需的行为。如果它包含任何其他列,EF 将生成一个中间实体来表示连接。

在这种情况下,从StudentCourse 表中删除代理键并将其替换为复合主键应该可以。

【讨论】:

  • 基本上,只要您对关系有额外的“属性”,您就会在 EF 中获得额外的实体。您只需将代理键视为“属性”。硬币的另一面是,如果你想要属性,这个额外的实体是必须的。 (想想 Employee 到 JobTitle 的关系,但 ~relationship 有一个“StartedOnDate”属性。因此你必须有这个额外的实体。
【解决方案2】:

您可以使用 ICollections 在 EF Code First 中执行此操作。例如:

public class Student 
{ 
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Course> Courses { get; set; }

    public Student()
    {
        Courses = New HashSet<Course>();
    }
}

重复课程并将其全部交换。这将在您的数据库中创建三个具有 m-to-m 关系的表(Student、Course 和 StudentCourse)。最重要的是,StudentCourse 将是一个不可见的链接表,在您的模型中没有实体。

【讨论】:

  • 网络上有很多关于它的scuttlebutt。我发现的最有用的文章是 Prashant Brall 的这篇文章。
  • 正确,只要 ~relationship 没有任何额外的属性。请参阅我对理查德认为的答案的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多