У меня есть база данных, сгенерированная первым, с таблицей AspNetUsers
со случайно сгенерированным ключом идентификатора строки, в которой уже зарегистрированы некоторые пользователи, мне нужно создать новый контроллер на новом webAPI, который будет регистрировать пользователей в том же AspNetUsers таблица с ролями и паролем Hash.
Я решил пойти code-first-fromDB, так что VisualStudio
создаст код из существующих таблиц для меня, чтобы я просто использовал EF6
и добавил новые строки, но я увидел, что с помощью этого метода генерируется случайное число ключ не работает, он говорит мне, что мне нужно дать Id, и я не могу его сгенерировать, потому что есть минимальная, но существующая возможность получить дубликат, так как генератор не будет знать, существует ли ключ в БД
Я попытался изменить унаследованный класс с DBContext на IdentityDbContext и создать новый пользовательский класс, который будет просто использоваться в качестве моста, и я сделал это:
, где
ctx: это идентификаторDBcontext.
login: полученная модель конечной точки.
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()"
}