我试图使用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.Id
和U.Id
,它们被视为Id
,但当涉及到与您的模型属性绑定时,它们是Id
和UserId
编译器得到问题映射到两个。因此,最好的方法是使用SQL AliasAS
来处理这个问题。
U.Id AS UserId
可以解决你的问题。
注意: 如果select查询中的主键相同,请记住使用
AS
将它们分开映射为相同的键。