簡體   English   中英

多個添加的實體可能在數據庫種子上具有相同的主鍵

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

有兩種可能的修復方法。

  1. 為實體在上下文中創建時生成臨時唯一標識符。 當實體被保存時,實體框架將丟棄它,但直到那時,它可以使用它來告訴一個新實體與另一個實體不同。 我過去曾為此目的使用過負整數。

  2. 不要使用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.

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