Entity Framework Core 原始 SQL 错误:System.ArgumentException 已添加具有相同键的项目。密钥: ID

nhu*_*uvy 2 c# entity-framework-core .net-core asp.net-core asp.net-core-webapi

我正在使用 .NET v5.0.100-preview.8.20417.9、ASP.NET Core Web API 5、Microsoft SQL Server 2019、Entity Framework Core v5.0.0-preview.8.20414.8。

\n

数据库

\n
CREATE TABLE [dbo].[AspNetUsers]\n(\n    [Id] [nvarchar](450) NOT NULL,\n    [UserName] [nvarchar](256) NULL,\n    [NormalizedUserName] [nvarchar](256) NULL,\n    [Email] [nvarchar](256) NULL,\n    [NormalizedEmail] [nvarchar](256) NULL,\n    [EmailConfirmed] [bit] NOT NULL,\n    [PasswordHash] [nvarchar](max) NULL,\n    [SecurityStamp] [nvarchar](max) NULL,\n    [ConcurrencyStamp] [nvarchar](max) NULL,\n    [PhoneNumber] [nvarchar](max) NULL,\n    [PhoneNumberConfirmed] [bit] NOT NULL,\n    [TwoFactorEnabled] [bit] NOT NULL,\n    [LockoutEnd] [datetimeoffset](7) NULL,\n    [LockoutEnabled] [bit] NOT NULL,\n    [AccessFailedCount] [int] NOT NULL,\n    [Fullname] [nvarchar](max) NULL,\n    [AliasName] [nvarchar](max) NULL,\n    [SecondMobile] [nvarchar](max) NULL,\n    [About] [nvarchar](max) NULL,\n    [Created] [datetime2](7) NULL,\n    [Modified] [datetime2](7) NULL,\n\n    CONSTRAINT [PK_AspNetUsers] \n        PRIMARY KEY CLUSTERED ([Id] ASC)\n                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, \n                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, \n                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]\n) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]\nGO\n\nCREATE TABLE [dbo].[trusted_person]\n(\n    [id] [int] IDENTITY(1,1) NOT NULL,\n    [fullname] [nvarchar](512) NULL,\n    [alias_name] [nvarchar](512) NULL,\n    [email] [nvarchar](512) NULL,\n    [phone_number1] [nvarchar](50) NULL,\n    [phone_number2] [nvarchar](50) NULL,\n    [phone_number3] [nvarchar](50) NULL,\n    [relationship_id] [int] NULL,\n    [about] [nvarchar](max) NOT NULL,\n    [avatar_id] [int] NULL,\n    [created] [datetime] NULL,\n    [modified] [datetime] NULL,\n\n    CONSTRAINT [PK_trusted_person] \n        PRIMARY KEY CLUSTERED ([id] ASC)\n                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, \n                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, \n                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]\n) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]\nGO\n\nCREATE TABLE [dbo].[user_trusted_person]\n(\n    [user_id] [nvarchar](450) NOT NULL,\n    [trusted_person_id] [int] NOT NULL,\n\n    CONSTRAINT [PK_user_trusted_person] \n        PRIMARY KEY CLUSTERED ([user_id] ASC, [trusted_person_id] ASC)\n                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, \n                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, \n                          ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]\n) ON [PRIMARY]\nGO\n\nINSERT INTO [dbo].[AspNetUsers] ([Id], [UserName], [NormalizedUserName], [Email], [NormalizedEmail], [EmailConfirmed], [PasswordHash], [SecurityStamp], [ConcurrencyStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled], [LockoutEnd], [LockoutEnabled], [AccessFailedCount], [Fullname], [AliasName], [SecondMobile], [About], [Created], [Modified]) \nVALUES (N\'4485e86d-3c2f-484f-a0b1-29e9c895bf9d\', N\'hanp2@example.io\', N\'HANP2@example.io\', N\'hanp2@example.io\', N\'HANP2@EXAMPLE.IO\', 1, N\'AQAAAAEAACcQAAAAELjSfhhpWmlwHb6fwrw9F/6DXQntlZMMcBMLDeiq1Ekkwf7V0IE76Bm7HoHwXUGUNA==\', N\'GTNEDRSWMSTHAGZVL4N7HOEHECUX3KC5\', N\'49bc54f6-217a-43f2-872e-b39e0453b90b\', N\'0909878767\', 0, 0, NULL, 1, 0, N\'Nguy\xe1\xbb\x85n Ph\xc6\xb0\xc6\xa1ng H\xc3\xa02\', N\'HaNP2\', N\'0123456765\', N\'PG\xc4\x90 k\xe1\xbb\xb9 thu\xe1\xba\xadt\', CAST(N\'2020-09-10T09:36:48.9768760\' AS DateTime2), CAST(N\'2020-09-10T09:36:48.9771728\' AS DateTime2))\nGO\n\nINSERT INTO [dbo].[AspNetUsers] ([Id], [UserName], [NormalizedUserName], [Email], [NormalizedEmail], [EmailConfirmed], [PasswordHash], [SecurityStamp], [ConcurrencyStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled], [LockoutEnd], [LockoutEnabled], [AccessFailedCount], [Fullname], [AliasName], [SecondMobile], [About], [Created], [Modified]) \nVALUES (N\'8ec8b490-bc7d-4468-af7f-9870ccd72981\', N\'tinlh@example.io\', N\'TINLH@example.io\', N\'tinlh@example.io\', N\'TINLH@EXAMPLE.IO\', 0, N\'AQAAAAEAACcQAAAAEMN05q50vK31c5v+GBm4JK9YdXXSDnugtplgn+o2u/eU2vJLNOyMl1t7EyENK5BGPQ==\', N\'3IIN7JKN5XCKPE7POFWFNHLZNHK7ZDKD\', N\'0559b9ec-9998-4183-84af-224aec4e1d12\', NULL, 0, 0, NULL, 1, 0, NULL, NULL, NULL, N\'Front-end developer\', CAST(N\'2020-09-10T08:22:30.1337889\' AS DateTime2), CAST(N\'2020-09-10T08:22:30.1352528\' AS DateTime2))\nGO\n\nINSERT INTO [dbo].[AspNetUsers] ([Id], [UserName], [NormalizedUserName], [Email], [NormalizedEmail], [EmailConfirmed], [PasswordHash], [SecurityStamp], [ConcurrencyStamp], [PhoneNumber], [PhoneNumberConfirmed], [TwoFactorEnabled], [LockoutEnd], [LockoutEnabled], [AccessFailedCount], [Fullname], [AliasName], [SecondMobile], [About], [Created], [Modified]) \nVALUES (N\'a9e23763-8285-4d4b-b466-e1d5d9287e43\', N\'hanp@example.io\', N\'HANP@example.io\', N\'hanp@example.io\', N\'HANP@EXAMPLE.IO\', 1, N\'AQAAAAEAACcQAAAAECIiSI1XQ9kL+8/RIS+ztOU5sU+J2KKFyODpoJPzfD9xL6r3H10WNhi/VITbv2mtfA==\', N\'QDOW7EB5XF6CIQZ4H4JBRRLSANIIGTHR\', N\'7eed1e98-ea18-4f4b-b017-c428adc2da73\', N\'0909878767\', 0, 0, NULL, 1, 0, N\'Nguy\xe1\xbb\x85n Ph\xc6\xb0\xc6\xa1ng H\xc3\xa0\', N\'HaNP\', N\'0123456765\', N\'PG\xc4\x90 k\xe1\xbb\xb9 thu\xe1\xba\xadt\', CAST(N\'2020-09-09T16:38:37.7443193\' AS DateTime2), CAST(N\'2020-09-09T16:38:37.7444016\' AS DateTime2))\nGO\n\nSET IDENTITY_INSERT [dbo].[trusted_person] ON \nGO\n\nINSERT INTO [dbo].[trusted_person] ([id], [fullname], [alias_name], [email], [phone_number1], [phone_number2], [phone_number3], [relationship_id], [about], [avatar_id], [created], [modified]) \nVALUES (2, N\'Nguy\xe1\xbb\x85n Thanh V\xc3\xa2n\', N\'Thanh V\xc3\xa2n\', N\'thanhvan@yahoo.com\', N\'0989873776\', N\'0989872777\', N\'0989876778\', 3, N\'Nguyen Van\', 42, CAST(N\'2020-09-10T09:32:07.443\' AS DateTime), NULL)\nGO\n\nINSERT INTO [dbo].[trusted_person] ([id], [fullname], [alias_name], [email], [phone_number1], [phone_number2], [phone_number3], [relationship_id], [about], [avatar_id], [created], [modified]) \nVALUES (3, N\'Nguyen Van An\', N\'An\', N\'ductx@example.io\', N\'0987656545\', N\'0987656546\', N\'0987656547\', 1, N\'abc\', 1, CAST(N\'2020-09-10T14:38:15.130\' AS DateTime), NULL)\nGO\nSET IDENTITY_INSERT [dbo].[trusted_person] OFF\nGO\nINSERT [dbo].[user_trusted_person] ([user_id], [trusted_person_id]) VALUES (N\'4485e86d-3c2f-484f-a0b1-29e9c895bf9d\', 3)\nGO\n\n
Run Code Online (Sandbox Code Playgroud)\n

在SQL Server Management Studio中,我可以查询成功,返回1条记录。

\n
SELECT * \nFROM trusted_person t\nLEFT JOIN user_trusted_person u ON u.trusted_person_id = t.id\nLEFT JOIN AspNetUsers a ON a.Id = u.user_id \nWHERE a.Id = \'4485e86d-3c2f-484f-a0b1-29e9c895bf9d\';\n
Run Code Online (Sandbox Code Playgroud)\n

C#代码:

\n
using System;\n\n#nullable disable\n\nnamespace shadow.Models\n{\n    public partial class TrustedPerson\n    {\n        public int Id { get; set; }\n        public string Fullname { get; set; }\n        public string AliasName { get; set; }\n        public string Email { get; set; }\n        public string PhoneNumber1 { get; set; }\n        public string PhoneNumber2 { get; set; }\n        public string PhoneNumber3 { get; set; }\n        public int? RelationshipId { get; set; }\n        public string About { get; set; }\n        public int? AvatarId { get; set; }\n        public DateTime? Created { get; set; }\n        public DateTime? Modified { get; set; }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

DbContextTrustedPeople- 复数TrustedPerson

\n
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore;\nusing shadow.Models;\n\nnamespace shadow.Data\n{\n    public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser>\n    {\n        public ApplicationDbContext()\n        {\n        }\n\n        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)\n            : base(options)\n        {\n        }\n\n        public virtual DbSet<ApplicationUser> ApplicationUsers { get; set; }       \n        public virtual DbSet<PaymentRequest> PaymentRequest { get; set; }\n        public virtual DbSet<TrustedPerson> TrustedPeople { get; set; }\n
Run Code Online (Sandbox Code Playgroud)\n
//SELECT* FROM trusted_person t\n//LEFT JOIN user_trusted_person u ON u.trusted_person_id = t.id\n//LEFT JOIN AspNetUsers a ON a.Id = u.user_id\n//WHERE a.Id = \'4485e86d-3c2f-484f-a0b1-29e9c895bf9d\';\n\n[HttpGet]\n[Route("user")]\npublic async Task<ActionResult<IEnumerable<TrustedPerson>>> GetAllTrustedPersonsByUserId(string UserId)\n{\n    var items = _db.TrustedPeople\n        .FromSqlRaw("" +\n            " SELECT * FROM trusted_person t " +\n            " LEFT JOIN user_trusted_person u ON u.trusted_person_id = t.id " +\n            " LEFT JOIN AspNetUsers a ON a.Id = u.user_id " +\n            " WHERE a.Id = \'{0}\'", UserId)\n        .ToList();\n    return Ok(items);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

错误

\n

在此输入图像描述

\n
System.ArgumentException: An item with the same key has already been added. Key: Id\n   at System.Collections.Generic.Dictionary`2.TryInsert(TKey key, TValue value, InsertionBehavior behavior)\n   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)\n   at Microsoft.EntityFrameworkCore.Query.Internal.FromSqlQueryingEnumerable`1.BuildIndexMap(IReadOnlyList`1 columnNames, DbDataReader dataReader)\n   at Microsoft.EntityFrameworkCore.Query.Internal.FromSqlQueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)\n   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)\n   at Microsoft.EntityFrameworkCore.Query.Internal.FromSqlQueryingEnumerable`1.Enumerator.MoveNext()\n   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)\n   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)\n   at shadow.Controllers.UserTrustedPersonController.GetAllTrustedPersonsByUserId(String UserId) in D:\\shadow_backend\\Controllers\\UserTrustedPersonController.cs:line 77\n   at lambda_method9(Closure , Object )\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()\n--- End of stack trace from previous location ---\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()\n--- End of stack trace from previous location ---\n   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)\n   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)\n   at Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)\n   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)\n   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)\n   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)\n\nHEADERS\n=======\nCache-Control: no-cache\nConnection: keep-alive\nAccept: */*\nAccept-Encoding: gzip, deflate, br\nAuthorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJFbWFpbCI6InRpbmxoQG1wc29sdXRpb25zLmlvIiwiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwNS8wNS9pZGVudGl0eS9jbGFpbXMvbmFtZWlkZW50aWZpZXIiOiIyODI1MTVmZi00ODljLTRmOWMtODQ4Ny1hNzcyZDcyYzMxMDkiLCJleHAiOjE2MDIzMTQ5MzMsImlzcyI6Imh0dHA6Ly9tcHNvbHV0aW9ucy5pbyIsImF1ZCI6Imh0dHA6Ly9tcHNvbHV0aW9ucy5pbyJ9.l0_PH63k05RpjH6lEj7TJWHW0wP8VuhtfWugzs1jjhg\nHost: localhost:5002\nUser-Agent: PostmanRuntime/7.26.5\nPostman-Token: 3ecd1393-9865-4e80-93f9-d0f707ee2ad7\n\n
Run Code Online (Sandbox Code Playgroud)\n

如何修复它?

\n

Orw*_*wel 7

您出现此错误是因为您查询返回许多名为“id”的列。

尝试替换select *select t.*.

[HttpGet]
[Route("user")]
public async Task<ActionResult<IEnumerable<TrustedPerson>>> GetAllTrustedPersonsByUserId(string UserId)
{
    var items = _db.TrustedPeople
        .FromSqlRaw("" +
            " SELECT t.* FROM trusted_person t " +
            " LEFT JOIN user_trusted_person u ON u.trusted_person_id = t.id " +
            " LEFT JOIN AspNetUsers a ON a.Id = u.user_id " +
            " WHERE a.Id = {0}", UserId)
        .ToList();
    return Ok(items);
}
Run Code Online (Sandbox Code Playgroud)

注意:" WHERE a.Id = {0}", UserId), 不是" WHERE a.Id = '{0}'", UserId)