[英]multiple added entities may have the same primary key on database seed
假設我使用實體框架6為asp.net mvc 5應用程序提供了以下模型結構
class Athlete {
int AthleteID {get; set;}
List<YearsAsAthlete> YearsAsAthlete {get;set;}
}
class YearsAsAthlete {
int YearsAsAthleteID {get;set;}
int AthleteID {get;set;}
[ForeignKey("AthleteID")]
Athlete Athlete {get;set;}
List<ContractRevenue> ContractRevenue {get;set;}
List<AdvertisementRevenue> AdvertisementRevenue {get;set;}
}
class ContractRevenue {
int ContractRevenueID {get;set;}
int YearsAsAthleteID {get;set;}
[ForeignKey("YearsAsAthleteID")]
YearsAsAthlete YearsAsAthlete {get;set;}
List<RevenueAmounts> RevenueAmounts {get;set;}
}
class AdvertisementRevenue {get;set;}
int AdvertisementRevenueID {get;set;}
int YearsAsAthleteID {get;set;}
[ForeignKey("YearsAsAthleteID")]
YearsAsAthlete YearsAsAthlete {get;set;}
List<RevenueAmounts> RevenueAmounts {get;set;}
}
class RevenueAmounts {
int RevenueAmountsID {get;set;}
int AmountPaid {get;set;}
date DateOfPayment {get;set;}
}
當我這樣的時候,這些模型工作得很好,他們有關系,一切都很美味,就像一個熱巧克力聖代。 當我運行它時,數據庫創建這些表,RevenueAmounts表為ContracRevenue和AdvertisementRevenue獲取2個自動生成的外鍵列。
但是,我不想要這些,因為它們的命名奇怪(ContractRevenue_ContractRevenueID),我需要一些方法來訪問我的post控制器方法中的foreginkey id屬性,以添加與正確的收入類型相關的新值。
當我將RevenueAmounts模型更改為以下內容時:
class RevenueAmounts {
int RevenueAmountsID {get;set;}
int AmountPaid {get;set;}
date DateOfPayment {get;set;}
// ***NOTE adding foreign keys here
int ContractRevenueID {get;set;}
[ForeginKey("ContractRevenueID")]
ContractRevenue ContractRevenue {get;set;}
int AdvertisementRevenueID {get;set;}
[ForeignKey("AdvertisementRevenueID")]
AdvertisementRevenue AdvertisementRevenue {get;set;}
}
我開始得到一個例外:
[SqlException(0x80131904):在表'AdvertisementRevenue'上引入FOREIGN KEY約束'FK_dbo.AdvertisementRevenue_dbo.YearsAsAthlete_YearsAsAthleteID'可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
** 編輯 **
我已經使用流暢的API關閉了級聯刪除功能但是現在我得到了一個不同的例外:
無法確定'GIP.DAL.ContractRevenue_RevenueAmounts'關系的主要結尾。 多個添加的實體可以具有相同的主鍵。
順便說一句,當我試圖將一堆信息播種到數據庫中然后在底部執行context.SaveChanges()
時(僅在結束時執行一次context.SaveChanges()
,拋出異常
在您的編輯中,您提到“多個添加的實體可能具有相同的主鍵”。 錯誤。 在不知道你在這里做什么的所有細節的情況下,聽起來你正在創建一個與實體的關系 - 在上下文中有兩個具有相同ID的實體。 這些可能是尚未保存的新實體,它們從數據庫中獲取自動生成的ID。 如果關系基於ID,則存在一些歧義,因為實體框架無法確定關系實際指向哪個新實體 - 它們都具有關系所指向的ID。
有兩種可能的修復方法。
為實體在上下文中創建時生成臨時唯一標識符。 當實體被保存時,實體框架將丟棄它,但直到那時,它可以使用它來告訴一個新實體與另一個實體不同。 我過去曾為此目的使用過負整數。
不要使用ID創建關系,而是使用實體引用創建關系。 如果實體框架具有對實體的直接引用,則它不需要經歷基於非唯一標識符來標識實體的過程,並且不應該具有該問題。
發生這種情況是因為在啟用Cascade刪除時,Entity Framework無法確定關系中的哪個對象是父對象。
你在使用Code First嗎? 生成遷移后,您將在表聲明中看到級聯刪除選項。 如果將其設置為false,則應解決此問題。
但是,更大的問題是您正在創建不實現聚合根的對象關系,這通常會避免此問題。
我有同樣的問題但在我的情況下有另一種解決方案。 在一個循環中,我為每個父母添加了父母,我正在添加孩子。 父母和孩子之間有關系。 當然我使用FK作為虛擬參考列,但問題仍然存在。
foreach (var parent in parents)
{
var id = parent.Id;
var parentEntity = new Parent();
this.Context.Set<Parent>().Add(parentEntity);
parentEntity.CreatedOn = DateTime.UtcNow;
...
foreach (var child in parents[id].Children)
{
var childEntity = new Child();
//this.Context.Set<Child>().Add(childEntity);
parent.Children.Add(childEntity);
childEntity.CreatedOn = DateTime.UtcNow;
...
}
}
我必須注釋掉將子實體添加到EF上下文的行,並修復了問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.