我有一个代码优先生成的数据库,该数据库带有一个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()"
}