gpt4 book ai didi

c# - Entity Framework 多对多,有 2 个表

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:50 26 4
gpt4 key购买 nike

场景

我正在使用一个包含两个表的现有数据库,这两个表创建了多对多关系,因为它们没有正确规范化。表结构如下所示。

Employee (table)

- PersonId
- JobId
- JobTitle
- OfficeLocation
- EmailAddress

Projects (table)

- PersonId
- JobId
- Supervisor
- ProjectName

我有以下 POCO:

public class Employee{
public int PersonId{get;set;}
public int JobId{get;set;}
//...
public virtual ICollection<Project> Projects{get;set;}
}

public class Project{
public int PersonId{get;set;}
public int JobId{get;set;}
//...
public virtual Employee Employee{get;set;}
}

我正在使用 EF Fluent API 调用将其连接起来

this.HasRequired(p=>p.Employee)
.WithMany(e=>e.Projects)
.HasForeignKey(p=>new {p.PersonId, p.JobId});

问题

情况是有些员工有多个职称和工作地点,产生多条Employee记录,然后每个员工有多个项目。问题是 Project.Employee 正在返回多条记录并生成以下错误:

A relationship multiplicity constraint violation occurred: An EntityReference can have no more than one related object, but the query returned more than one related object. This is a non-recoverable error.

我试图将 Project 类更改为

public virtual ICollection<Employee> Employee{get;set;}

this.HasMany(e=>e.Courses)
.WithMany()

但是 EF 希望有一个将员工与项目相关联的“中间表”。

我意识到数据库结构存在问题,但此时我只能使用此设置。是否可以使用 Entity Framework 建立这种类型的关系,或者是否有任何关于如何解决这个问题的建议?

最佳答案

我的第一个建议是修复模式,但如果这不可能,我在我们的项目中遇到了一个有点类似的问题,最适合我们的是创建两个 DBContext。在您的情况下,每个上下文在每个方向上都有一对多的关系。根据您想要查询数据的方式,Employee->Project 或 Project->Employee 将决定您使用哪个 DBContext。如果您使用的是流畅的 API,您可以保持所有的 pocos 相同,并且只有两个不同的映射配置文件。这是我写的一篇关于这个问题的博文。

http://blog.mvmiller.net/2013/10/working-with-legacy-database-schemas.html

关于c# - Entity Framework 多对多,有 2 个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23517364/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com