簡體   English   中英

具有數據庫優先多對多關系問題的實體框架 6

[英]Entity Framework 6 with Database-First Many to Many relationship problem

我首先使用多對多關系模式在使用 EF 6 DB 時遇到了一些問題。 這是一個簡化的示例:

public partial class Person
{
    public int Id { get; set; }
    public string Name{ get; set; }
    public virtual ICollection<Car> Cars { get; set; }
}

public partial class Car
{
    public Car()
    {
        this.People = new HashSet<Person>();
        this.Tires = new HashSet<Tire>();
    }

    public int Id { get; set; }
    public string Model{ get; set; }
    public string Make { get; set; }
    public virtual ICollection<Person> People { get; set; }
    public virtual ICollection<Tire> Tires { get; set; }
}

public partial class Tire
{
    public Tire()
    {
        this.Cars = new HashSet<Car>();
    }

    public string Model{ get; set; }
    public int Size { get; set; }
    public virtual ICollection<Car> Cars{ get; set; }
}

為此,數據庫中有五個表:


人車測繪

汽車輪胎測繪

三個用於存儲數據的表和兩個用於映射/關聯數據的表。 當我創建一個人 object,用數據填充它並嘗試保存它時,就會出現我的問題。

一個人可能有多輛汽車,一輛汽車可能有不同的 model 輪胎,因此是多對多映射。 如果我創建一個人 object,有多輛車,但其中幾輛車具有相同的 Model 輪胎(輪胎表的 PK),EF 不會首先檢查輪胎 Z20F35E630DAF44DBFA4C3F68 的一部分object(通過關聯),並嘗試將其兩次或多次添加到輪胎表中。 實際上,只需要修改映射表以顯示 Car 和(已經存在的)輪胎之間的新映射。

所以在構建了一個人 object 之后,有多輛汽車,多輪胎的汽車等並嘗試:

context.Person.Add(personObject)
context.SaveChanges();

在輪胎表上給出主鍵沖突錯誤。 我錯過了什么?
EF 似乎只通過從映射表中刪除來處理刪除,但添加給我帶來了問題。

[編輯]
我將對此進行一些更改,因為我找到了解決原始問題的解決方案,但出現了類似的問題。

以下是我將如何構建幾個人對象:

Person p1 = new Person() { Id = 1, Name = "Joe" }
Car car1 = new Car() { Id = 1, Make = "Honda", Model = "Accord" } 
Car car2 = new Car() { Id = 2, Make = "Honda", Model = "Civic" }
Tire tire1 = new Tire() { Model = "ModelA", Size = 16 }
car1.Tires.Add(tire1);
p1.Cars.Add(car1);
p1.Cars.Add(car2);

Person p2 = new Person() { Id = 2, Name = "Bob" }
Car car3 = new Car() { Id = 1, Make = "Honda", Model = "Accord" } 
p1.Cars.Add(car3);

// Finally
context.Person.Add(p1);
context.SaveChanges();   // Necessary to save twice.  Don't ask.

context.Person.Add(p2);
context.SaveChanges();

這會引發主鍵沖突,因為它會在保存 p2 時嘗試添加 ID 為 1 的 Car。 有沒有辦法讓 EF 足夠聰明,以實現只需要添加關聯表,並且 Car 表本身不需要被觸及,因為 ID 為 1 的 Car 已經存在於 Car 表中?

您可以在調用 SaveChanges 之前指定實體 state。

context.Entry(existingCar).State = EntityState.Unchanged;


EF 處理引用。 對具有相同密鑰的 object 的兩個不同引用不被視為同一事物:

Person p1 = new Person() { Id = 1, Name = "Joe" }
Car car1 = new Car() { Id = 1, Make = "Honda", Model = "Accord" } 
p1.Cars.Add(car1);

Person p2 = new Person() { Id = 2, Name = "Bob" }
Car car3 = new Car() { Id = 1, Make = "Honda", Model = "Accord" } 
p2.Cars.Add(car3);

汽車 1 和 3 是兩個獨立的引用,但指向汽車 ID=1。 我認為您的示例中有一個錯誤,它有p1.Cars.Add(car3)而不是 p2。 無論哪種方式,問題都在於兩個汽車實例。 反而:

Person p2 = new Person() { Id = 2, Name = "Bob" }
p2.Cars.Add(car1);

現在,汽車 ID 1 將在人員 1 和人員 2 之間正確引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM