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.Id
和 U.Id
被视为 Id
但是当涉及到与您的模型属性绑定时,它们是 Id
和 UserId
编译器得到用两个映射的问题。所以最好的方法是使用 SQL Alias AS
来处理这个问题。
U.Id AS UserId
会解决您的问题。
注意:如果选择查询中的主键相同,请记住通过 uisng
AS
将它们分开,否则它将 映射为相同的键。
【讨论】:
啊!现在太明显了谢谢你。我将实施此修复程序并让您知道它是如何进行的。谢谢。 不用担心。如果相应地解决了问题,请告诉我们您的更新。我希望它会。以上是关于GET 调用:已添加具有相同密钥的项目。键:标识的主要内容,如果未能解决你的问题,请参考以下文章
工作区出现故障,TFS说“已经添加了一个具有相同密钥的项目”。
Windows Azure:“已添加具有相同密钥的项目。”选择时抛出异常