[英]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.