Заявление INSERT противоречит

Эта ошибка здесь популярна, но у меня другой случай. Я связал таблицы. У меня есть данные в таблице отдела, значит, внешний ключ существует.

Вот ошибка:

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, Action1 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.

Любое полезное предложение было бы замечательно.

Я думаю, вы пытаетесь использовать "deparment_id", которого не существует. Выполните отладку и посмотрите значение Department_id в вашем запросе на вставку и убедитесь, что оно существует в таблице dbo.Department

Eray Balkanli 15.11.2018 15:36

Есть данные в таблице Департамента. И я уверен, что использую существующий идентификатор.

V. Shikongo 15.11.2018 15:37

Если вы вставляете данные в таблицу Departments, а затем в другую таблицу, где Department_id является внешним ключом, используя потоки, убедитесь, что вы сначала добавляете данные в таблицу Department (которая является родительской).

Eray Balkanli 15.11.2018 15:42

Вы вставляете нового ApplicationUser без какой-либо ссылки на Department, поэтому держу пари, что его Department_Id равен 0.

Gert Arnold 15.11.2018 15:54

@GertArnold, я полагаю, не 0, а ноль.

Eray Balkanli 15.11.2018 16:02
Я считаю - Не надо. Это либо 0, либо ноль, разберитесь.
Gert Arnold 15.11.2018 16:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
211
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, столбцы, которые вы добавили в таблицу 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");
    }        
}  

Другие вопросы по теме