Sql server MVC标识-INSERT语句与外键约束冲突
我知道这个问题已经讨论过好几次了,但这个问题与内置身份模型有关 我已经创建了一个名为“Company”的自定义模型。注册新用户时,我还要选择公司名称 我已将所需的数据添加到RegisterViewModel中,视图和表单将按应有的方式显示。我已经在Company表中添加了2家公司,因此该值不应为nullSql server MVC标识-INSERT语句与外键约束冲突,sql-server,asp.net-mvc,asp.net-identity,Sql Server,Asp.net Mvc,Asp.net Identity,我知道这个问题已经讨论过好几次了,但这个问题与内置身份模型有关 我已经创建了一个名为“Company”的自定义模型。注册新用户时,我还要选择公司名称 我已将所需的数据添加到RegisterViewModel中,视图和表单将按应有的方式显示。我已经在Company表中添加了2家公司,因此该值不应为null public class RegisterViewModel { ... Removed some irrelevant code ... [Required(E
public class RegisterViewModel
{
... Removed some irrelevant code ...
[Required(ErrorMessage = "You must select a company name.")]
[Display(Name = "Company")]
public int CompanyID { get; set; }
public virtual Company ApplicationUser_Company { get; set; }
当我想插入一个新用户时,出现以下错误:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.AspNetUsers_dbo.Companies_CompanyID". The conflict occurred in database "aspnet-ProjectMed-20160327120257", table "dbo.Companies", column 'CompanyID'.
The statement has been terminated.
正在检查帐户控制器,我看不到任何问题:
// GET: /Account/Register
[AllowAnonymous]
public ActionResult Register()
{
ViewBag.CompanyID = new SelectList(db.Companies, "CompanyID", "Company_Name");
return View();
}
//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email, ApplicationUser_FirstName = model.ApplicationUser_FirstName, ApplicationUser_LastName = model.ApplicationUser_LastName, ApplicationUser_Company = model.ApplicationUser_Company };
var result = await UserManager.CreateAsync(user, model.Password); <<<---- This is where the error occurs <<<---
if (result.Succeeded)
{
await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
return RedirectToAction("Index", "Home");
}
AddErrors(result);
}
// If we got this far, something failed, redisplay form
return View(model);
}
公司表:
CREATE TABLE [dbo].[Companies] (
[CompanyID] INT IDENTITY (1, 1) NOT NULL,
[Company_Name] NVARCHAR (50) NOT NULL,
[Company_Code] NVARCHAR (9) NOT NULL,
[Company_Address1] NVARCHAR (100) NOT NULL,
[Company_Address2] NVARCHAR (100) NULL,
[Company_PostalCode] NVARCHAR (15) NOT NULL,
[Company_City] NVARCHAR (50) NOT NULL,
[CountryID] INT NOT NULL,
[Company_CLOG] BIT NOT NULL,
[Company_SubAgent] BIT NOT NULL,
CONSTRAINT [PK_dbo.Companies] PRIMARY KEY CLUSTERED ([CompanyID] ASC),
CONSTRAINT [FK_dbo.Companies_dbo.Countries_CountryID] FOREIGN KEY ([CountryID]) REFERENCES [dbo].[Countries] ([CountryID]) ON DELETE CASCADE
);
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Company_Code]
ON [dbo].[Companies]([Company_Code] ASC);
GO
CREATE NONCLUSTERED INDEX [IX_CountryID]
ON [dbo].[Companies]([CountryID] ASC);
有什么想法吗?有什么问题吗?Gut告诉我它在这条线内(为了清晰/评论,请分开): 但是请注意,如果您的
ApplicationUser
实体有两个属性(大多数都有),一个用于ID,另一个用于外部关系;e、 g
public int CompanyID { get; set; } // ID property
[ForeignKey("CompanyID")]
public virtual Company Company { get; set; } // entity property
您只需分配/或。在这种情况下,在填充
ApplicationUser
之前不需要执行查找,只需设置user.CompanyID=model.CompanyID代码>多亏了你最后的建议,我似乎发现了错误!我试图设置外键的值,如果ID
适用于我的代码:
[HttpPost]
public async Task<ActionResult> Register(RegisterViewModel model)
{
// verify the models' valid
if (ModelState.IsValid)
{
var user = new ApplicationUser {
/* ... */,
CompanyID = model.CompanyID // entity we retrieved
};
//
// SignInManager yatta yata
//
}
return View(model); // Uh-oh fallback.
}
[HttpPost]
公共异步任务寄存器(RegisterViewModel模型)
{
//验证模型的有效性
if(ModelState.IsValid)
{
var user=新应用程序用户{
/* ... */,
CompanyID=model.CompanyID//我们检索到的实体
};
//
//签名经理yatta yata
//
}
返回视图(模型);//Uh-oh回退。
}
那么model.ApplicationUser\u公司值在UserManager.CreateAsync之前是正确的?谢谢!我添加了查找“var company=db.companys…”,似乎我们离解开这个谜团又近了一步。但是现在我得到了一个错误“一个实体对象不能被多个IEntityChangeTracker实例引用。”。有什么建议吗?很抱歉,如果这是一个新手问题…:)
public int CompanyID { get; set; } // ID property
[ForeignKey("CompanyID")]
public virtual Company Company { get; set; } // entity property
[HttpPost]
public async Task<ActionResult> Register(RegisterViewModel model)
{
// verify the models' valid
if (ModelState.IsValid)
{
var user = new ApplicationUser {
/* ... */,
CompanyID = model.CompanyID // entity we retrieved
};
//
// SignInManager yatta yata
//
}
return View(model); // Uh-oh fallback.
}