假设我使用实体框架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()在底部进行操作时(仅在末尾执行一次),将引发异常
context.SaveChanges()
在编辑中,您提到“添加的多个实体可能具有相同的主键”。错误。在不知道您正在执行的所有详细信息的情况下,听起来好像您正在与实体建立关系- 在上下文中有两个实体具有相同的ID。这些可能是尚未保存的新实体,它们是从数据库中自动生成的ID的位置。如果关系是基于ID的,则存在一些歧义,因为Entity Framework无法确定该关系实际指向的是哪个新实体-它们都具有该关系指向的ID。
有两个潜在的修复程序。
为在上下文中创建的实体生成临时的唯一标识符。实体框架将在保存实体时将其丢弃,但直到此时,它可以使用它来区分一个新实体。过去,我为此使用负整数。
不要使用ID而是使用实体引用来创建关系。如果实体框架直接引用了该实体,则它不需要经过基于非唯一标识符来标识该实体的过程,也就不会出现此问题。