Entity framework 迁移到Asp.Net Identity 2.0:未在AspNetUsers表中创建新列

Entity framework 迁移到Asp.Net Identity 2.0:未在AspNetUsers表中创建新列,entity-framework,asp.net-mvc-5,identity,Entity Framework,Asp.net Mvc 5,Identity,当我尝试使用Identity 2.0和默认MVC 5应用程序注册新用户时,出现以下错误: Invalid column name 'Email'. Invalid column name 'EmailConfirmed'. Invalid column name 'PhoneNumber'. Invalid column name 'PhoneNumberConfirmed'. Invalid column name 'TwoFactorEnabled'. Invalid column name

当我尝试使用Identity 2.0和默认MVC 5应用程序注册新用户时,出现以下错误:

Invalid column name 'Email'.
Invalid column name 'EmailConfirmed'.
Invalid column name 'PhoneNumber'.
Invalid column name 'PhoneNumberConfirmed'.
Invalid column name 'TwoFactorEnabled'.
Invalid column name 'LockoutEndDateUtc'.
Invalid column name 'LockoutEnabled'.
Invalid column name 'AccessFailedCount'.
(repeats 2 more times, I have a total of 4 test users in AspNetUsers table.)
我有一个小应用程序,我刚刚从MVC4/Identity 1.0升级到MVC5/Identity 2.0,所以我让Identity 1.0列(用户名、密码哈希、SecurityStamp、鉴别器)正常工作

  • 我正在使用一个带有标准Identity 1.0表的远程托管SQL2012数据库
  • 我创建了一个“干净”的项目,注册了一个用户,它在localDB上运行良好
  • 我在远程数据库上成功运行了“添加迁移初始值”和“更新数据库”
  • 我最初是这样做的,但没有生成步骤5中的代码。我尝试手动粘贴它,然后再次运行“更新数据库-详细”。似乎已成功完成,但仍会出现错误
谢谢你的帮助

迁移和配置.cs文件

internal sealed class Configuration : DbMigrationsConfiguration<FactBanker.Models.ApplicationDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(FactBanker.Models.ApplicationDbContext context)
    {

    }
}

您确定在Dbcontext中获得了正确的用户类吗?如果要修改用户表,应按如下方式插入:

public class ApplicationDbContext : IdentityDbContext<MyCustomUserClass>
{
    ...
}
public类ApplicationDbContext:IdentityDbContext
{
...
}
不要放任何类似于:

public DbSet<MyCustomUserClass> Users { get; set; }
公共数据库集用户{get;set;}

因为它已经发生在基类中。

原因是您已升级到Microsoft.AspNet.Identity.EntityFramework 2.0.0.0,这会更改用户上下文


要修复此问题,请生成一个新的db(设置一个新的连接字符串mdf文件)或更改sql表。

我也遇到了同样的问题。根据Dan Gershony所说的,我只是卸载了Microsoft.AspNet.Identity.EntityFramework 2.0.0.0,并安装了一个旧版本,如Microsoft.AspNet.Identity.EntityFramework-版本1.0.0。这解决了我的问题。

我也有同样的问题。我使用了这个手动迁移,还没有遇到任何其他问题

public override void Up()
{
    RenameColumn(table: "dbo.AspNetUserClaims", name: "User_Id", newName: "UserId");
    RenameIndex(table: "dbo.AspNetUserClaims", name: "IX_User_Id", newName: "IX_UserId");
    DropPrimaryKey("dbo.AspNetUserLogins");
    AddColumn("dbo.AspNetUsers", "Email", c => c.String(maxLength: 256));
    AddColumn("dbo.AspNetUsers", "EmailConfirmed", c => c.Boolean(nullable: false));
    AddColumn("dbo.AspNetUsers", "PhoneNumber", c => c.String()); 
    AddColumn("dbo.AspNetUsers", "PhoneNumberConfirmed", c => c.Boolean(nullable: false));
    AddColumn("dbo.AspNetUsers", "TwoFactorEnabled", c => c.Boolean(nullable: false));
    AddColumn("dbo.AspNetUsers", "LockoutEndDateUtc", c => c.DateTime());
    AddColumn("dbo.AspNetUsers", "LockoutEnabled", c => c.Boolean(nullable: false));
    AddColumn("dbo.AspNetUsers", "AccessFailedCount", c => c.Int(nullable: false));
    AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: false, maxLength: 256));
    AlterColumn("dbo.AspNetUsers", "FirstName", c => c.String(nullable: false));
    AlterColumn("dbo.AspNetUsers", "LastName", c => c.String(nullable: false));
    AddColumn("dbo.AspNetUsers", "CreatedDateTime", c => c.DateTime(nullable: false));
    AlterColumn("dbo.AspNetRoles", "Name", c => c.String(nullable: false, maxLength: 256));
    AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
    CreateIndex("dbo.AspNetUsers", "UserName", unique: true, name: "UserNameIndex");
    CreateIndex("dbo.AspNetRoles", "Name", unique: true, name: "RoleNameIndex");
    DropColumn("dbo.AspNetUsers", "Discriminator");
} 

摘自:

尝试了user1502551提出的解决方案,但它给了我一些问题,并且没有包括Down()方法。我遇到的问题是,从Identity 1.0开始,被修改的索引在默认情况下并不存在,而且还有一些2.0/2.1不希望出现的额外列(即名字和姓氏字段)。完全向上()和向下()此处:


您必须修改已在版本2.0中更新的所有实体,例如:

public partial class AspNetUser
{    
    public AspNetUser()
    {
        AspNetUserClaims = new HashSet<AspNetUserClaim>();
        AspNetUserLogins = new HashSet<AspNetUserLogin>();
        AspNetRoles = new HashSet<AspNetRole>();
    }

    public string Id { get; set; }

    [StringLength(256)]
    public string UserName { get; set; }

    public string PasswordHash { get; set; }

    public string SecurityStamp { get; set; }

    [MaxLength(256)]
    public string Email { get; set; }

    public bool EmailConfirmed { get; set; }

    public string PhoneNumber { get; set; }

    public bool PhoneNumberConfirmed { get; set; }

    public bool TwoFactorEnabled { get; set; }

    public DateTime LockoutEndDateUtc { get; set; }

    public bool LockoutEnabled { get; set; }

    public int AccessFailedCount { get; set; }

    public int UserId { get; set; }

    public virtual ICollection<AspNetUserClaim> AspNetUserClaims { get; set; }

    public virtual ICollection<AspNetUserLogin> AspNetUserLogins { get; set; }

    public virtual User User { get; set; }

    public virtual ICollection<AspNetRole> AspNetRoles { get; set; }
}

public partial class AspNetUserClaim
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string ClaimType { get; set; }

    public string ClaimValue { get; set; }

    [Required]
    [StringLength(128)]
    public string UserId { get; set; }

    public virtual AspNetUser AspNetUser { get; set; }
}
公共部分类AspNetUser
{    
公共AspNetUser()
{
AspNetUserClaims=newhashset();
AspNetUserLogins=newhashset();
AspNetRoles=newhashset();
}
公共字符串Id{get;set;}
[StringLength(256)]
公共字符串用户名{get;set;}
公共字符串密码哈希{get;set;}
公共字符串SecurityStamp{get;set;}
[最大长度(256)]
公共字符串电子邮件{get;set;}
公共布尔值{get;set;}
公共字符串PhoneNumber{get;set;}
public bool phonenumberconfirm{get;set;}
公共bool TwoFactorEnabled{get;set;}
公共日期时间LockoutEndDateUtc{get;set;}
public bool LockoutEnabled{get;set;}
public int AccessFailedCount{get;set;}
public int UserId{get;set;}
公共虚拟ICollection AspNetUserClaims{get;set;}
公共虚拟ICollection AspNetUserLogins{get;set;}
公共虚拟用户用户{get;set;}
公共虚拟ICollection AspNetRoles{get;set;}
}
公共部分类AspNetUserClaim
{
[关键]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
公共int Id{get;set;}
公共字符串ClaimType{get;set;}
公共字符串ClaimValue{get;set;}
[必需]
[第128段]
公共字符串用户标识{get;set;}
公共虚拟AspNetUser AspNetUser{get;set;}
}

您还需要修改在dbcontext的OnModelCreating方法中更改的实体的映射,然后可以添加迁移,因为我遇到了相同的错误。我所做的只是在AspNetUser中手动添加LockoutEndDateUtc列

您提到的指南没有完整的迁移信息,其中缺少多个列。。。当您运行
添加迁移
时,它是否创建了迁移脚本?你能分享你的
配置.cs
[任何]\u initial.cs
?很高兴知道,谢谢。我已经添加了提到的文件,正在寻找描述完整标识2.0架构的内容。在运行“添加迁移和更新数据库”之前,您是否尝试过关闭自动迁移
AutomaticMigrationsEnabled=false
?是的,我后来确实将其设置为true。我只是将其更改为false,然后再次运行添加迁移/更新数据库,结果相同。欣赏你的想法。欣赏你的想法,但不,我根本没有修改或添加任何用户类。与我拥有的初始starter应用程序的唯一区别是,我的数据库中有其他表,这些表将aspnetusers表中的Id列作为外键引用。我从这些表中删除了FK约束,并再次运行了迁移/更新,但这并没有什么不同。感谢您的响应。这是对问题的一个很好的总结。但是,如果我手动更改表,我认为这并不能解决问题。使用addmigration/updatedatabase应该更改表,这是代码优先实体框架的要点。我现在将此标记为答案,因为这是我见过的最接近的答案,现在我正在尝试的答案是完全抛弃EF,通过插入我自己的IUserStore实现我自己的数据访问层,相关文章在这里添加到Dan Gershony的答案中:我向SQL添加了一个空白的新db,并将连接字符串指向这个新db。运行添加迁移/更新数据库以构建identity 2.0的aspNet表。然后,根据所产生的更改,我用新的列/名称更新了我的普通dev数据库。终于能够登录,认证等,我想这是p
public override void Up()
    {
        RenameColumn(table: "dbo.AspNetUserClaims", name: "User_Id", newName: "UserId");
        AddColumn("dbo.AspNetUsers", "Email", c => c.String());
        AddColumn("dbo.AspNetUsers", "EmailConfirmed", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "PhoneNumber", c => c.String());
        AddColumn("dbo.AspNetUsers", "PhoneNumberConfirmed", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "TwoFactorEnabled", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "LockoutEndDateUtc", c => c.DateTime());
        AddColumn("dbo.AspNetUsers", "LockoutEnabled", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "AccessFailedCount", c => c.Int(nullable: false));
        AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: false));
        DropColumn("dbo.AspNetUsers", "Discriminator");
    }

    public override void Down()
    {
        AddColumn("dbo.AspNetUsers", "Discriminator", c => c.String(nullable: false, maxLength: 128));
        AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: true));
        DropColumn("dbo.AspNetUsers", "AccessFailedCount");
        DropColumn("dbo.AspNetUsers", "LockoutEnabled");
        DropColumn("dbo.AspNetUsers", "LockoutEndDateUtc");
        DropColumn("dbo.AspNetUsers", "TwoFactorEnabled");
        DropColumn("dbo.AspNetUsers", "PhoneNumberConfirmed");
        DropColumn("dbo.AspNetUsers", "PhoneNumber");
        DropColumn("dbo.AspNetUsers", "EmailConfirmed");
        DropColumn("dbo.AspNetUsers", "Email");
        RenameColumn(table: "dbo.AspNetUserClaims", name: "UserId", newName: "User_Id");
    }
public partial class AspNetUser
{    
    public AspNetUser()
    {
        AspNetUserClaims = new HashSet<AspNetUserClaim>();
        AspNetUserLogins = new HashSet<AspNetUserLogin>();
        AspNetRoles = new HashSet<AspNetRole>();
    }

    public string Id { get; set; }

    [StringLength(256)]
    public string UserName { get; set; }

    public string PasswordHash { get; set; }

    public string SecurityStamp { get; set; }

    [MaxLength(256)]
    public string Email { get; set; }

    public bool EmailConfirmed { get; set; }

    public string PhoneNumber { get; set; }

    public bool PhoneNumberConfirmed { get; set; }

    public bool TwoFactorEnabled { get; set; }

    public DateTime LockoutEndDateUtc { get; set; }

    public bool LockoutEnabled { get; set; }

    public int AccessFailedCount { get; set; }

    public int UserId { get; set; }

    public virtual ICollection<AspNetUserClaim> AspNetUserClaims { get; set; }

    public virtual ICollection<AspNetUserLogin> AspNetUserLogins { get; set; }

    public virtual User User { get; set; }

    public virtual ICollection<AspNetRole> AspNetRoles { get; set; }
}

public partial class AspNetUserClaim
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string ClaimType { get; set; }

    public string ClaimValue { get; set; }

    [Required]
    [StringLength(128)]
    public string UserId { get; set; }

    public virtual AspNetUser AspNetUser { get; set; }
}