Миграция в Asp.Net Identity 2.0: новые столбцы не создаются в таблице AspNetUsers

Я получаю следующую ошибку при попытке зарегистрировать нового пользователя, используя 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, дискриминатор).

  • я использовал удаленно размещенную БД SQL2012 со стандартными таблицами Identity 1.0.
  • Я создал "чистый" проект, зарегистрировал пользователя, и он работал нормально на localDB.
  • я успешно запустил "add-migration initial" и "update-database" в моей удаленной базе данных.
  • Я изначально следовал это официальное руководство , и код на шаге 5 не был сгенерирован. Я попытался вставить его вручную и снова запустил "update-database-verbose". Казалось, успешно завершено, но все же получить ошибку.

признателен за любую помощь!

миграция и конфигурация.cs файлы

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

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

    }
}

}

моя миграция V023.cs файл Оба метода Up() и Down() были пустыми.

public partial class V023 : DbMigration
{
    public override void Up()
    {

    }

    public override void Down()
    {

    }
}

6 ответов


У меня была та же проблема. Я использовал эту ручную миграцию, и у меня еще не возникло никаких дополнительных проблем.

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");
} 

взято из: http://adamstephensen.com/2014/05/02/upgrading-from-asp-net-identity-1-0-to-2-0/


причина обновления для Microsoft.сеть САШ.Тождественность.EntityFramework 2.0.0.0 и это изменяет контекст пользователя.

чтобы исправить либо создать новую БД (установить новый файл mdf строки подключения), либо изменить таблицу sql.


У меня была та же проблема. Основываясь на том, что сказал Дэн Гершони, я просто удалил Microsoft.сеть САШ.Тождественность.EntityFramework 2.0.0.0 и установите более старую версию, такую как Microsoft.сеть САШ.Тождественность.EntityFramework-Версия 1.0.0. Это решило мою проблему.


попробовал решение, предложенное user1502551, но оно дало мне проблемы и не включало метод Down (). Проблемы у меня были в том, что изменяемые индексы не существовали по умолчанию из Identity 1.0, и было несколько дополнительных столбцов, которые 2.0/2.1 не ожидает (а именно поля имени и фамилии). Full Up() и Down () здесь:

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");
    }

вы должны изменить все сущности, которые были обновлены в версии 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; }
}

вам также необходимо изменить сопоставления сущностей, которые изменились в методе OnModelCreating вашего dbcontext, после этого вы можете добавить свою миграцию


вы уверены, что получили правильный класс пользователя в вашем Dbcontext? Если вы хотите изменить свою таблицу пользователей, вы должны сделать следующее:

public class ApplicationDbContext : IdentityDbContext<MyCustomUserClass>
{
    ...
}

и не ставьте ничего вроде:

public DbSet<MyCustomUserClass> Users { get; set; }

там, так как это уже произойдет в базовом классе.