簡體   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