当前位置: 首页 > 面试题库 >

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

海典
2023-03-14
问题内容

假设我使用实体框架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()在底部进行操作时(仅在末尾执行一次),将引发异常


问题答案:

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

有两个潜在的修复程序。

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

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



 类似资料:
  • 目前正在进行一个项目,我的Spring Boot项目需要在同一个DB服务器中利用多个数据源或模式。我发现了几个在spring boot中教授多数据源配置的教程,其中实体foo存在于数据源A中,bar存在于数据源B中,即下面的内容。, https://scattercode.co.uk/2016/01/05/multiple-databases-with-spring-boot-和spring数据j

  • 问题内容: 我是Swift的新手,我已经遍历了一些教程,其中许多教程使用同一个名称多次定义了一个函数。 我已经习惯了其他编程语言,否则将无法执行此操作。 因此,我检查了官方的Swift手册,还检查了override关键字,以了解可以得到的结果,但是仍然无法理解以下代码: 从我看到的函数tableView设置在第1行和第5行,我注意到的唯一区别是第一个tableView函数返回,而第二个函数返回(U

  • 我正在尝试创建用于测试目的的播种机。我有通过房间id属于房间的用户,这些房间是通过房间种子程序创建的,在我的用户种子程序中,我创建一个用户并更新房间id属性,如下所示, 我的问题是,这里生成的所有用户,都获得相同的房间id,如何才能从数据库中真正获得随机房间id,并在我的播种机中使用它?

  • 让我快速描述一下我的问题。 我有5个客户的5个数据库,每个数据库都有一个名为SubnetSettings的表。 我已经创建了一个下拉列表来选择一个客户,并将显示属于所选客户的SubnetSSet表,并允许我创建、编辑和删除。 我可以毫无问题地创建、删除,但当我想编辑数据时,它会带来错误: /运输管理系统应用程序中的服务器错误。 附加“CFS”类型的实体。领域实体。SubnetSettings“失败

  • 错误消息:附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值。 问题:我如何以类似于下面代码中AttachActivity方法所示的方式附加实体? 我必须假设上面错误消息的“另一个实体”部分指的是内存中存在但超出范围的对象(?)。我之所以注意到这一点,是因为我尝试附加的实体类型的DBSet的本地属性返回零。 我有理由相信实体不存在于上下文中,因为我遍历代码并在创建上下文时观察上下文。实