GET调用:已经添加了具有相同键的项.关键:Id



我试图使用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

知道为什么我可能得到这个错误吗?

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

U.Id AS UserId可以解决你的问题。

注意: 如果select查询中的主键相同,请记住使用AS将它们分开映射为相同的键。

相关内容

  • 没有找到相关文章

最新更新