添加实体身份模型(Adding entity to Identity model)

2019-10-23 03:25发布

我目前得到一个错误我理解的错误,但我不知道在哪里,我错了

ALTER TABLE语句冲突与外键约束“FK_dbo.AspNetUsers_dbo.CompanyDetails_userCompanyID”。 发生于数据库“PXWHITESPIDERDEV”,表“dbo.CompanyDetails”的冲突,列“companyID”。

内IdentityModel自动生成的,当你创建一个MVC应用程序

public class ApplicationUser : IdentityUser
{

    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
        // Add custom user claims here
        return userIdentity;
    }


    public int userCompanyID { get; set; }

    [ForeignKey("userCompanyID")]
    public CompanyDetails company { get; set; }
}

这里是我试图创建实体

 public class CompanyDetails
 {
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int companyID { get; set; }

    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 1)]
    [Display(Name = "Company Name")]
    public string CompanyName { get; set; }
 }

和RegisterViewModel类中

public class RegisterViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    public CompanyDetails company { get; set; }
}

前companyID的人的ApplicationUser类和CompanyDetails类中一样在他们有相同的变量名。 我认为这是问题的ApplicationUser类内变化。所以,变量名,直到我试图再次更新数据库,并发现了这种情况并非如此。

Answer 1:

当您添加新companyID属性,实体框架显然需要一个新的列添加到dbo.AspNetUsers表来代表它。 由于本专栏之前并不存在,是不可为空的,需要一些默认值,以在现有记录的列设置。 对于int类型,默认值是0 。 然而, 0是不可接受的,因为一个外键,所以当实体框架试图附上约束,它失败。

解决该问题的最简单的方法是:1)从除去所有存在的行dbo.AspNetUsers或2)添加列并手动更新值来实际CompanyDetails附接外键约束之前的ID。

或者,你也可以让companyId一个可空INT,这将使实体框架来将其清零在数据库中添加列时。 外键约束可以加入到同列空,所以一切都应该工作,然后。 然而,这意味着关系现在是可选的。 如果每个用户都应该始终有一个相关的CompanyDetails ,然后找到另一种方式来解决这个问题。



文章来源: Adding entity to Identity model