将实体添加到Identity模型

时间:2015-05-14 18:09:34

标签: c# entity-framework asp.net-mvc-5 asp.net-identity

我目前收到错误我理解错误但我不知道我哪里出错了

  

ALTER TABLE语句与FOREIGN KEY约束冲突" FK_dbo.AspNetUsers_dbo.CompanyDetails_userCompanyID"。冲突发生在数据库" PXWHITESPIDERDEV",table" dbo.CompanyDetails",column' companyID'。

在创建MVC应用程序时自动生成的IdentityModel

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类中的变量名,直到我再次尝试更新数据库并发现情况并非如此。

1 个答案:

答案 0 :(得分:2)

当您添加新的companyID属性时,实体框架显然需要向dbo.AspNetUsers表添加一个新列来表示它。由于此列之前不存在且不可为空,因此需要在现有记录的列中设置一些默认值。对于int类型,默认值为0。但是,0作为外键是不可接受的,因此当实体框架尝试附加该约束时,它会失败。

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

或者,您也可以使companyId成为可空的int,这将允许Entity Framework在添加列时在数据库中将其清空。外键约束可以添加到具有空值的列,因此一切都应该工作。但是,这意味着这种关系现在是可选的。如果每个用户都应该始终拥有相关的CompanyDetails,那么找另一种方法来解决问题。