INSERT конфликтует - PullRequest
       5

INSERT конфликтует

0 голосов
/ 15 ноября 2018

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

Вот ошибка:

Оператор INSERT вступил в конфликт с ограничением FOREIGN KEY "FK_dbo.AspNetUsers_dbo.Department_Department_Id". Конфликт произошел в базе данных «aspnet-hr_pcms-20181109102923», таблица «dbo.Department», столбец «Department_Id».

Ошибка источника:

Строка 153: {
Строка 154: var user = new ApplicationUser {UserName = model.Email, Email = model.Email};
Строка 155: var result = await UserManager.CreateAsync (пользователь, модель. Пароль);
Строка 156: если (результат. Успешно)
Строка 157: {

Основная ошибка в строке 155

Трассировка стека:

[SqlException (0x80131904): оператор INSERT конфликтовал с ограничением FOREIGN KEY «FK_dbo.AspNetUsers_dbo.Department_Department_Id». Конфликт произошел в базе данных «aspnet-hr_pcms-20181109102923», таблица «dbo.Department», столбец «Department_Id».

System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое разбиение на разрыв, действие 1 wrapCloseInAction) +2555674 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) +5958364 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj, логический вызывающий объектHasConnectionLock, логический асинхронныйClose) +285 System.Data.SqlClient.TdsParser.TryRun (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean4 & 4) и данные System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, логическое значение isInternal, логическое значение дляDescribeParameterEncryption, логическое значение mustCacheForAlwaysEnrysed) System.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader (логическое значение isInternal, логическое значение дляDescribeParameterEncryption) +262 System.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery (IAsyncResult asyncResult, String endMethod, логический isInternal) +652 System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal (IAsyncResult asyncResult) +245 System.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync (IAsyncResult asyncResult) +156 System.Threading.Tasks.TaskFactory 1.FromAsyncCoreLogic(IAsyncResult iar, Func 2 endFunction, действие 1 endAction, Task 1 обещание, логическое значение требует синхронизации) +86 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) +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 (Задача) +99 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) +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.

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

1 Ответ

0 голосов
/ 15 ноября 2018

Кажется, что столбцы, которые вы добавили в таблицу AspNetUsers, включают в себя внешний ключ для Department_Department_Id.Я полагаю, что проблема заключается в том, что вы добавляете пользователя - но код добавления не задает значение Department_Id этого пользователя - поэтому фактически он добавляет ноль для Department_Id, а ключи не могут быть нулевыми.Чтобы это исправить - создайте пользовательский класс MyUser, производный от ApplicationUser, включая Department_Id и любые другие релевантные столбцы, и используйте этот производный класс для создания нового пользователя.Затем назначьте DepartmentId перед вызовом Create.

Я сделал это некоторое время назад, возможно, придется Google это, поскольку есть примеры того, как добавить столбцы в определенные таблицы AspNet.Я считаю, что я также обновил сценарии, используемые проектом для создания таблиц, с новыми определенными в них столбцами, поэтому при запуске без базы данных создается новый файл с правильной конфигурацией.Исходя из вашего текста, вы, возможно, уже сделали это ...

Обновление - (я могу только добавить здесь, нужно больше повторений, прежде чем я смогу добавлять комментарии или отвечать на них).
Подумал, что вы могли бы Google это -Я сделал.Вы не прокомментировали, добавили ли вы столбцы в модель 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");
    }        
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...