繁体   English   中英

有2个表的多对多实体框架

[英]Entity Framework many to many with 2 tables

脚本

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

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返回多个记录并生成以下错误:

发生关系多重性约束冲突:EntityReference最多只能有一个相关对象,但是查询返回了多个相关对象。 这是不可恢复的错误。

我试图将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

我建议您为每个关联实体创建一个一对多的关联实体,称其为Employee和Projects一对一的关联实体(EmployeeProjects)PK将为ProjectID + EmployeeID。

查看您的poco类,似乎多对多关系的定义不明确尝试将项目更改为public class Project{ public int PersonId{get;set;} public int JobId{get;set;} //... public virtual ICollection <Employee> Employees{get;set;} }

changing 
public virtual ICollection&lt;Employee&gt; Employees{get;set;}
</code>

并检查数据库中是否必须有名称为ProjectEmployee的表,反之亦然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM