我的問題是使用EF6在代碼優先的數據庫中保存作爲多對多關係一部分的現有對象。EF6多對多插入
我從web服務接收對象,他們看起來(簡體),如:
public class Car
{
[DataMember]
public virtual string CarId { get; set; }
[DataMember]
public virtual ICollection<Contract> Contracts { get; set; }
}
public class Contract
{
[DataMember]
public virtual string ContractId { get; set; }
[DataMember]
public virtual ICollection<Car> Cars { get; set; }
}
我有一個代碼,第一個數據庫並設置有關係:
modelBuilder.Entity<Contract>().HasKey(t => new {t.ContractId});
modelBuilder.Entity<Car>().HasKey(t => new {t.CarId})
.HasMany(c => c.Contracts)
.WithMany(c => c.Cars)
.Map(x =>
{
x.ToTable("CarContracts");
x.MapLeftKey("CarId");
x.MapRightKey("ContractId");
});
當我我可以保存第一輛汽車的列表以及EF成功創建關係表和合同。在第二輛車上保存失敗,說「約束失敗UNIQUE約束失敗:Contracts.ContractId」,因爲我試圖插入Contract
與Id
作爲已有的合同。
,我發現這個問題的解決方案是設置Contract
在dbContext
附:
foreach (var contract in car.Contracts)
{
context.Contract.Attach(contract);
}
這將引發同樣的異常與先前保存。當我嘗試修改第二輛車的合同列表時,我得到一個NotSupportedException
,我能想到的唯一解決方案是重新創建汽車物件並將相同的合同對象附加到它們上面,這似乎不必要的複雜。
有什麼方法可以告訴EF我的兩個不同的合同對象實際上是相同的嗎?
? – tede24
通過WCF服務,所以我沒有自己創建它們 – user613068
你能解釋爲什麼第二次插入必須與現有的汽車和合同組合?錯誤消息明確指出它違反了Contracts表中的UNIQUE約束。 – user613068