Sql server MVC标识-INSERT语句与外键约束冲突

Sql 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

我知道这个问题已经讨论过好几次了,但这个问题与内置身份模型有关

我已经创建了一个名为“Company”的自定义模型。注册新用户时,我还要选择公司名称

我已将所需的数据添加到RegisterViewModel中,视图和表单将按应有的方式显示。我已经在Company表中添加了2家公司,因此该值不应为null

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.
}