如何使用另一个EF6 codefirst控制器将用户添加到现有的AspNetUsers表中

时间:2019-07-08 16:31:56

标签: entity-framework asp.net-web-api entity-framework-6 ef-code-first dbcontext

我有一个代码优先生成的数据库,该数据库带有一个AspNetUsers表,该表具有一个随机生成的字符串ID密钥,该密钥已经注册了一些用户,我需要在新的webAPI上创建一个新的控制器,该控制器将在其中注册用户相同的AspNetUsers表,包括角色和密码哈希。

我决定先从DB开始编写代码,以便VisualStudio将现有表中的代码放入支架中,以便我只使用EF6并添加新行,但是我看到了这种方法,随机生成的密钥不起作用,它告诉我我需要提供一个Id,而我不能生成一个Id,因为生成器将不知道密钥是否存在,因此存在最小但现有的可能性来获取重复项在数据库中

我尝试将继承的类从DBContext更改为IdentityDbContext,并创建一个将仅用作桥接的新用户类,我做到了:

其中 ctx:是identityDBcontext。

登录:是端点的接收模型。

RoleName:是在数据库中创建的角色的名称。


string userRoleId = ctx.AspNetRoles.FirstOrDefault(c => c.Name == "RoleName").Id;
                var hash = new PasswordHasher();
                AspNetUsers newUser = ctx.AspNetUsers.Add(new AspNetUsers
                {
                    UserName = login.email,
                    Email = login.email,
                    EmailConfirmed = false,
                    PasswordHash = hash.HashPassword(login.password)
                });

                newUser.AspNetRoles.Add(new AspNetRoles
                {
                    Id = userRoleId
                });

                //newUser.PasswordHash = hash.HashPassword(login.password);
                var result = ctx.SaveChanges();

当我在邮递员中运行它时,我会得到

    {
        "Message": "Error.",
        "ExceptionMessage": "One or more validation errors were detected during model generation:\r\n\r\nLoginControler.Models.IdentityUserRole: : EntityType '

IdentityUserRole' has no key defined. Define the key for this EntityType.\r\nLoginControler.Models.IdentityUserLogin: : EntityType 'IdentityUserLogin' has no key defined. Define the key for this EntityType.\r\nIdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' is based on type 'IdentityUserRole' that has no keys defined.\r\nIdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' is based on type 'IdentityUserLogin' that has no keys defined.\r\n",
    "ExceptionType": "System.Data.Entity.ModelConfiguration.ModelValidationException",
    "StackTrace": "   en LoginControler.Controllers.LoginController.<Post>d__1.MoveNext() en c:\\users\\usuario\\documents\\visual studio 2015\\Projects\\LoginControler\\LoginControler\\Controllers\\LoginController.cs:línea 83\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n   en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   en System.Threading.Tasks.TaskHelpersExtensions.<CastToObject>d__3`1.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n   en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   en System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n   en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   en System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n   en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n   en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   en System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}

0 个答案:

没有答案