INSERT语句冲突



这个错误在这里很常见,但我在这里有不同的情况。我把桌子连起来了。我在部门表中有数据,所以外键存在。

这里是错误:

INSERT语句与FOREIGN KEY约束"FK_dbo.AspNetUsers_dbo.Department_Department_Id"冲突。冲突发生在数据库"aspnet-hr_pcms-20181109102923"表"dbo.Depart"列"Department_Id’"中。

来源错误:

第153行:{
第154行:var user=new ApplicationUser{UserName=model.Email,Email=model.Email}
第155行:var result=await UserManager.CreateAsync(user,model.Password)
第156行:if(result.Successed)
第157行:{

主要错误在第155行中

堆栈跟踪:

[SqlException(0x80131904):INSERT语句与FOREIGN KEY约束"FK_dbo.AspNetUsers_dbo.Department_Department_Id"冲突。冲突发生在数据库"aspnet-hr_pcms-20181109102923"表"dbo.Departer"列"Department_Id’"中。

System.Data.SqlClient.SqlConnection.OnError(SqlException异常,布尔breakConnection,操作1 wrapCloseInAction) +2555674 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)+5958364System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔调用程序HasConnectionLock,布尔异步关闭)+285System.Data.SqlClient.TdsParser.TryRun(RunBehavior RunBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&dataReady)+4169System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior RunBehavior,String resetOptionsString,布尔值为内部,布尔值用于DescribeParameterEncryption,布尔值应为AlwaysEncrypted缓存)+255System.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader(布尔值为Internal,布尔值用于DescribeParameterEncryption)+262System.Data.SqlClient.SqlCommand.InteralEndExecuteNonQuery(IAsyncResult asyncResult,String endMethod,Boolean isInternal)+652System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult-asyncResult)+245System.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult-asyncResult)+156System.Threading.Tasks.TaskFactory1.FromAsyncCoreLogic(IAsyncResult iar, Func2 endFunction,Action1 endAction, Task1 promise,Boolean requires Synchronization)+86System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+99System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58System.Data.Entity.Utilities.CultureAwaiter`1.GetResult()+38系统.数据.实体.核心.映射.更新.内部.d_0.MoveNext()+2714System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+99System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+58系统.数据.实体.核心.映射.更新.内部.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:UsersAdministratorsourcereposhr_pcmshr_pcmsControllersAccountController.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表添加列来扩展Model。

任何有用的建议都会很好。

您添加到AspNetUsers表中的列似乎包括Department_Department_Id的外键。我认为问题是您正在添加一个用户,但添加代码没有设置该用户的Department_Id,因此实际上它为Department_Id添加了一个null,键不能为null。要解决此问题,请创建一个从ApplicationUser派生的自定义MyUser类,包括Department_Id和任何其他相关列,并使用该派生类创建新用户。然后在调用Create之前分配DepartmentId。

我不久前做过这件事,可能不得不在谷歌上搜索,因为有一些关于如何将列添加到定义的AspNet表的示例。我相信我还更新了项目用来创建表的脚本,其中定义了新列,所以如果在没有数据库的情况下运行,它会创建一个配置正确的新表。从你的短信中,你可能已经这样做了。。。

更新-(我只能在这里添加,在添加或回复评论之前需要更多的代表)
以为你可以用谷歌搜索一下——我做到了。您没有评论您是只是向AspNetUsers模型添加列,还是像我提到的那样创建了一个派生类。其他人回答了我做的同样的事情——如果不先为他们分配DepartmentId,你就无法实例化新用户——也不能先实例化,因为你需要UserId先存在——所以必须像我建议的那样同时实例化。

以下是一些正确添加列到AspNetUser的链接:

  • Ruard van Elburg在这里对有人做同样的回答事情在那篇文章中,下一个答案是如何做的MS链接它在VS2013中
  • 来自MS的另一篇关于向身份验证模型
  • MSDN上一篇专门讨论在AS.NET中存储用户信息的文章身份

看看这些链接,看看它有多容易。这里有一个快速的想法-没有在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");
}        
}  

最新更新