Эта ошибка здесь популярна, но у меня другой случай. Я связал таблицы. У меня есть данные в таблице отдела, значит, внешний ключ существует.
Вот ошибка:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.AspNetUsers_dbo.Department_Department_Id". The conflict occurred in database "aspnet-hr_pcms-20181109102923", table "dbo.Department", column 'Department_Id'.
Source Error:
Line 153: {
Line 154: var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
Line 155: var result = await UserManager.CreateAsync(user, model.Password);
Line 156: if (result.Succeeded)
Line 157: {
Основная ошибка в строке 155
Трассировки стека:
[SqlException (0x80131904): The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.AspNetUsers_dbo.Department_Department_Id". The conflict occurred in database "aspnet-hr_pcms-20181109102923", table "dbo.Department", column 'Department_Id'.
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction) +2555674 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) +5958364 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +285 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +4169 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted) +255 System.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader(Boolean isInternal, Boolean forDescribeParameterEncryption) +262 System.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, String endMethod, Boolean isInternal) +652 System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult) +245 System.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult) +156 System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction, Action1 endAction, Task1 promise, Boolean requiresSynchronization) +86 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Data.Entity.Utilities.CultureAwaiter`1.GetResult() +38 System.Data.Entity.Core.Mapping.Update.Internal.d__0.MoveNext() +2714 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 System.Data.Entity.Core.Mapping.Update.Internal.d__0.MoveNext() +417
[UpdateException: An error occurred while updating the entries. See the inner exception for details.]
System.Data.Entity.Core.Mapping.Update.Internal.<UpdateAsync>d__0.MoveNext() +640
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.Core.Objects.<ExecuteInTransactionAsync>d__3d`1.MoveNext() +741
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.Core.Objects.<SaveChangesToStoreAsync>d__39.MoveNext() +379
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.SqlServer.<ExecuteAsyncImplementation>d__9`1.MoveNext() +346
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Data.Entity.Core.Objects.<SaveChangesInternalAsync>d__31.MoveNext() +799
[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.]
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
Microsoft.AspNet.Identity.EntityFramework.<SaveChanges>d__61.MoveNext() +214
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
Microsoft.AspNet.Identity.EntityFramework.<CreateAsync>d__38.MoveNext() +243
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) +25
Microsoft.AspNet.Identity.<CreateAsync>d__73.MoveNext() +1050
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
Microsoft.AspNet.Identity.<CreateAsync>d__79.MoveNext() +442
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
hr_pcms.Controllers.<Register>d__15.MoveNext() in C:\Users\Administrator\source\repos\hr_pcms\hr_pcms\Controllers\AccountController.cs:155
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +99
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult) +97
System.Web.Mvc.Async.<>c__DisplayClass8_0.<BeginInvokeAsynchronousActionMethod>b__1(IAsyncResult asyncResult) +17
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__11_0() +50
System.Web.Mvc.Async.<>c__DisplayClass11_1.<InvokeActionMethodFilterAsynchronouslyRecursive>b__2() +228
System.Web.Mvc.Async.<>c__DisplayClass7_0.<BeginInvokeActionMethodWithFilters>b__1(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
System.Web.Mvc.Async.<>c__DisplayClass3_6.<BeginInvokeAction>b__3() +35
System.Web.Mvc.Async.<>c__DisplayClass3_1.<BeginInvokeAction>b__5(IAsyncResult asyncResult) +100
System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
System.Web.Mvc.<>c.<BeginExecuteCore>b__152_1(IAsyncResult asyncResult, ExecuteCoreState innerState) +11
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +45
System.Web.Mvc.<>c.<BeginExecute>b__151_2(IAsyncResult asyncResult, Controller controller) +13
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc.<>c.<BeginProcessRequest>b__20_1(IAsyncResult asyncResult, ProcessRequestState innerState) +28
System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.InvokeEndHandler(IAsyncResult ar) +152
System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +125
В этом приложении, которое я использовал, выбрал индивидуальную аутентификацию. Я никогда не редактировал AccountController, но я расширил модель, добавив столбцы в таблицу AspNetUsers.
Любое полезное предложение было бы замечательно.
Есть данные в таблице Департамента. И я уверен, что использую существующий идентификатор.
Если вы вставляете данные в таблицу Departments, а затем в другую таблицу, где Department_id является внешним ключом, используя потоки, убедитесь, что вы сначала добавляете данные в таблицу Department (которая является родительской).
Вы вставляете нового ApplicationUser без какой-либо ссылки на Department, поэтому держу пари, что его Department_Id равен 0.
@GertArnold, я полагаю, не 0, а ноль.





Кажется, столбцы, которые вы добавили в таблицу AspNetUsers, включают внешний ключ для Department_Department_Id. Я считаю, что проблема заключается в том, что вы добавляете пользователя, но код добавления не устанавливает этого пользователя Department_Id, поэтому, по сути, он добавляет нулевое значение для Department_Id, а ключи не могут быть нулевыми. Чтобы исправить это, создайте собственный класс MyUser, производный от ApplicationUser, включая Department_Id и любые другие соответствующие столбцы, и используйте этот производный класс для создания нового пользователя. Затем назначьте DepartmentId перед вызовом Create.
Я сделал это некоторое время назад, возможно, придется погуглить, так как есть примеры того, как добавлять столбцы в определенные таблицы AspNet. Я считаю, что я также обновил сценарии, которые проект использует для создания таблиц с новыми столбцами, определенными в них, поэтому при запуске без базы данных создается новый с правильной конфигурацией. Судя по вашему тексту, вы, возможно, уже сделали это ...
Обновление - (я могу только добавить сюда, мне нужно больше представителей, прежде чем я смогу добавить или ответить на комментарии) .
Подумал, что можно погуглить - я сделал.
Вы не комментировали, просто добавили ли вы столбцы в модель AspNetUsers - или создали производный класс, как я уже упоминал. Другие ответили на то же самое, что и я - вы не можете создать экземпляр нового пользователя, не назначив сначала для них DepartmentId, и не можете сделать это первым, так как вам нужно, чтобы UserId существовал первым, поэтому это должно быть сделано одновременно, как я предложенный.
Вот несколько ссылок, которые правильно добавляют столбцы в AspNetUser:
Посмотрите на эти ссылки и убедитесь, насколько это просто. Вот небольшая идея - не реализованная в VS, извините - непроверенная. но просто чтобы дать вам общее представление ... У меня нет доступа к проекту, для которого я работал в прошлом году, поэтому не могу дать быстрых точных ответов.
public class ApplicationUser : IdentityUser
{
// Because it is derived, all existing AspNetUser columns are inherited
// just need to add your new columns
public int DepartmentId { get; set; }
}
// model used for login page - with validation within page for items
public class LoginViewModel()
{
public string username { get; set; }
public string password { get; set; }
public List<SelectListItem> DepartmentList {
get {return new List<SelectListItem>() {
new SelectListItem() {Text = "Department A", Value = "1"},
new SelectListItem() {Text = "Department B", Value = "2"},
new SelectListItem() {Text = "Department C", Value = "3"}
};
}
private int selectedDepartment {
return DepartmentList.SelectedValue != null ?
Convert.Int32(DepartmentList.SelectedValue) : -1;
}
}
на вашей веб-странице (вы не сказали, что вы используете asp.net/mvc/other) - они также должны выбрать, в какой отдел войти, возможно, раскрывающийся список со значениями, например
Html.DropDownFor(x => x.SelectedItem, Model.DepartmentList)
// then something like
public async Task<ActionResult> Login(LoginViewModel lmodel, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(lmodel);
}
ApplicationUser user = new ApplicationUser() {
UserName = lmodel.username,
Password = lmodel.password,
//... other AspNetUser values assigned?
//...,
Department_Id = lmodel.selectedDepartment
}
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded) {
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
}
Я думаю, вы пытаетесь использовать "deparment_id", которого не существует. Выполните отладку и посмотрите значение Department_id в вашем запросе на вставку и убедитесь, что оно существует в таблице dbo.Department