一尘不染

多个添加的实体在数据库种子上可能具有相同的主键

mysql

假设我使用实体框架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),我需要某种方法来访问我的后控制器方法中的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()在底部进行操作时(仅在末尾执行一次),将引发异常


阅读 354

收藏
2020-05-17

共1个答案

一尘不染

在编辑中,您提到“添加的多个实体可能具有相同的主键”。错误。在不知道您正在执行的所有详细信息的情况下,听起来好像您正在与实体建立关系-
在上下文中有两个实体具有相同的ID。这些可能是尚未保存的新实体,它们是从数据库中自动生成的ID的位置。如果关系是基于ID的,则存在一些歧义,因为Entity
Framework无法确定该关系实际指向的是哪个新实体-它们都具有该关系指向的ID。

有两个潜在的修复程序。

  1. 为在上下文中创建的实体生成临时的唯一标识符。实体框架将在保存实体时将其丢弃,但直到此时,它可以使用它来区分一个新实体。过去,我为此使用负整数。

  2. 不要使用ID而是使用实体引用来创建关系。如果实体框架直接引用了该实体,则它不需要经过基于非唯一标识符来标识该实体的过程,也就不会出现此问题。

2020-05-17