GET 调用:已添加具有相同密钥的项目。键:标识

Posted

技术标签:

【中文标题】GET 调用:已添加具有相同密钥的项目。键:标识【英文标题】:GET Call: An item with the same key has already been added. Key: Id 【发布时间】:2021-10-30 22:16:47 【问题描述】:

我正在尝试使用 EF Core 调用 SQL Server 数据库中的存储过程。 db 服务器使用 Docker 托管。问题是当我对控制器进行 GET 调用以访问服务时,它会停止一段时间,然后出现此错误...

ArgumentException:已添加具有相同键的项目。键:ID

这是我的代码:

模型

public interface IGiftList

   int Id  get; set; 
   string Occasion  get; set; 
   int UserId  get; set; 
   string Alias  get; set; 
   bool AnotherRecipient  get; set; 
   string RecipientName  get; set; 
   int RecipientAddressId  get; set; 


public class GiftList : IGiftList

   public int Id  get; set; 
   public string Occasion  get; set; 
   public int UserId  get; set; 
   public string Alias  get; set; 
   public bool AnotherRecipient  get; set; 
   public string RecipientName  get; set; 
   public int RecipientAddressId  get; set; 
   public List<Gift> Items  get; set;

控制器

[HttpGet, Route("lists")]
public List<GiftList> GetUserLists([FromQuery] int userId)

   var lists = _giftService.GetUserLists(userId).Select(l => (GiftList)l).ToList();
   return lists;

服务

public List<IGiftList> GetUserLists(int userId)

   var items = this.giftContext.Lists.FromSqlRaw($"EXECUTE dbo.GetUserLists @UserId=userId").ToList<IGiftList>(); <--Exception gets raised here.
   return items;

存储过程

CREATE PROCEDURE dbo.GetUserLists 
(
    @UserId INT
)
AS
DECLARE @ListId INT

SET @ListId = (SELECT TOP (1) Id FROM Lists WHERE UserId = @UserId);

SELECT 
    L.Id,
    O.Title,
    U.Id,
    L.Alias,
    L.AnotherRecipient,
    L.RecipientName,
    L.RecipientAddressId
FROM Lists AS L
JOIN Occasions AS O
    ON O.Id = L.OccasionId
JOIN Users AS U
    ON U.Id = L.UserId
WHERE
    L.UserId = @UserId

知道为什么我会收到此错误吗?

【问题讨论】:

原始数据是什么样的? 由于这两个L.Id, U.Id, 被视为Id,所以使用别名U.Id AS UserId 使它们具有不同的名称,将解决问题。 与您的错误无关,您的程序不需要点击两次Lists 并且缺少top(1) 的排序标准 - 您将获得 1 个随机 ID 修改strore程序的这个字段U.Id AS UserId, @Stu 好点。 SP还没有完成。我试图在小部分完成这项任务。现在我已经让它工作了(感谢 Md Farid),现在我可以继续它了。我得到了列表 ID,因为我将对实际项目进行第二次调用,以便该 SP 将返回两个数据集。不知道如何在 ef core 中做到这一点,所以如果有人有想法或可以为我指出正确的方向,那么我将永远感激不尽:) 【参考方案1】:

这是因为您的 Store Procedure's 两个字段 L.IdU.Id 被视为 Id 但是当涉及到与您的模型属性绑定时,它们是 IdUserId 编译器得到用两个映射的问题。所以最好的方法是使用 SQL Alias AS 来处理这个问题。

U.Id AS UserId 会解决您的问题。

注意:如果选择查询中的主键相同,请记住通过 uisng AS 将它们分开,否则它将 映射为相同的键。

【讨论】:

啊!现在太明显了谢谢你。我将实施此修复程序并让您知道它是如何进行的。谢谢。 不用担心。如果相应地解决了问题,请告诉我们您的更新。我希望它会。

以上是关于GET 调用:已添加具有相同密钥的项目。键:标识的主要内容,如果未能解决你的问题,请参考以下文章

已添加具有相同键的实体框架核心 3.1.6 项

已添加具有相同键的项目

工作区出现故障,TFS说“已经添加了一个具有相同密钥的项目”。

Windows Azure:“已添加具有相同密钥的项目。”选择时抛出异常

Ionic.Zip ArgumentException(已添加具有相同密钥的项目)

IStatefulServiceReplica.Open 上的错误 - 已添加具有相同密钥的项目