gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:38:58 26 4
gpt4 key购买 nike

假设我有以下使用 Entity Framework 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),我需要一些方法来访问我的后 Controller 方法中的 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. 为在上下文中创建的实体生成一个临时的、唯一的标识符。 Entity Framework 将在保存实体时丢弃它,但在此之前,它可以使用它来区分一个新实体和另一个实体。我过去曾为此目的使用过负整数。

  2. 不要使用 ID 创建关系,而是使用实体引用。如果Entity Framework直接引用实体,那么它就不需要经过基于非唯一标识符识别实体的过程,应该不会有这个问题。

关于c# - 多个添加的实体可能在数据库种子上具有相同的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26783934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com