entity-framework - 如何将数据库架构从 Identity 2.2.0 迁移到 3.0.0-rc1-final

标签 entity-framework asp.net-core-mvc entity-framework-migrations

我一直在尝试使用 ASP.NET Identity 2.2.0 迁移在 MVC5 上运行的现有应用程序,但无法找到正确的信息,我想问一下您应该如何进行此迁移?

我已经在这个问题上使用了几个小时,并找到了一个解决方案,该解决方案允许我使用 Identity 3.0.0-rc1-final 和 ef7 在我的旧但迁移的数据库上登录。

我会发布我所做的作为答案,但我非常喜欢灵感或其他方式来做到这一点。

最佳答案

首先,我使用以下命令生成了一个新的迁移

dnx ef migration add MigrateIdentityFrameworkFrom2to3

这在 Migrations 文件夹中生成了两个文件
  • XYZ_MigrateIdentityFrameworkFrom2to3.cs
  • ApplicationDbContextModelSnapshot.cs

  • 快照与 ef6 相同,它是对数据库外观的描述。另一个文件是包含用于迁移数据库的 Up 和 Down 命令的实际迁移。

    迁移到 Identity 3.0.0-rc1-final 架构的问题似乎是
  • AspNetRoles 两个新的数据库列(ConcurrencyStamp、NormalizedName)
  • AspNetUsers 4 个新列(ConcurrencyStamp、LockoutEnd、NormalizedEmail、NormalizedUserName)
  • 新表(AspNetRoleClaims)

  • 通常,AspNetUsers 和 AspNetRole 上的主键以及这些表的外键的长度已从 128 更改为 450

    以下是我曾经能够登录到我的 MVC6 应用程序的 Up 和 Down 命令:
    protected override void Up(MigrationBuilder migrationBuilder)
    {
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId", "AspNetUserRoles");
            migrationBuilder.DropPrimaryKey("PK_dbo.AspNetRoles", "AspNetRoles");
    
            migrationBuilder.Sql(@"
            ALTER TABLE[AspNetRoles]
            ALTER COLUMN[Id] NVARCHAR(450) NOT NULL
    
            ALTER TABLE[AspNetUserRoles]
            ALTER COLUMN[RoleId] NVARCHAR(450) NOT NULL");
    
            migrationBuilder.AddPrimaryKey("PK_dbo.AspNetRoles", "AspNetRoles", "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId", "AspNetUserRoles", "RoleId", "AspNetRoles", principalColumn:"Id");
    
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId", "AspNetUserClaims");
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId", "AspNetUserLogins");
            migrationBuilder.DropForeignKey("FK_dbo.User_dbo.AspNetUsers_IdentityUser_Id", "User");
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId", "AspNetUserRoles");
            migrationBuilder.DropPrimaryKey("PK_dbo.AspNetUsers", "AspNetUsers");
    
            migrationBuilder.Sql(@"
            ALTER TABLE [AspNetUsers]
            ALTER COLUMN [Id] NVARCHAR(450) NOT NULL
    
            ALTER TABLE[AspNetUserRoles]
            ALTER COLUMN[UserId] NVARCHAR(450) NOT NULL
    
            ALTER TABLE[User]
            ALTER COLUMN[IdentityUser_Id] NVARCHAR(450) NOT NULL
    
            ALTER TABLE[AspNetUserLogins]
            ALTER COLUMN[UserId] NVARCHAR(450) NOT NULL
    
            ALTER TABLE[AspNetUserClaims]
            ALTER COLUMN[UserId] NVARCHAR(450) NOT NULL");
    
            migrationBuilder.AddPrimaryKey("PK_dbo.AspNetUsers", "AspNetUsers", "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId", "AspNetUserRoles", "UserId", "AspNetUsers", principalColumn: "Id");
            migrationBuilder.AddForeignKey("FK_dbo.User_dbo.AspNetUsers_IdentityUser_Id", "User", "IdentityUser_Id", "AspNetUsers", principalColumn: "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId", "AspNetUserLogins", "UserId", "AspNetUsers", principalColumn: "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId", "AspNetUserClaims", "UserId", "AspNetUsers", principalColumn: "Id");
    
            migrationBuilder.AddColumn<string>(name: "ConcurrencyStamp", table: "AspNetRoles", nullable: true);
            migrationBuilder.AddColumn<string>(name: "NormalizedName", table: "AspNetRoles", nullable: true);
    
            migrationBuilder.Sql(@"UPDATE AspNetRoles SET NormalizedName = UPPER(Name)");
    
            migrationBuilder.AddColumn<string>(name: "ConcurrencyStamp", table: "AspNetUsers", nullable: true);
            migrationBuilder.AddColumn<string>(name: "LockoutEnd", table: "AspNetUsers", nullable: true);
            migrationBuilder.AddColumn<string>(name: "NormalizedEmail", table: "AspNetUsers", nullable: true);
            migrationBuilder.AddColumn<string>(name: "NormalizedUserName", table: "AspNetUsers", nullable: true);
            migrationBuilder.Sql(@"UPDATE AspNetUsers SET NormalizedEmail = UPPER(Email), NormalizedUserName = UPPER(UserName)"); // MVC6 utilizes Email as login by default with forms authentication, and searches for the email in NormalizedUserName, I changed the login formular to utilize UserName instead of email when logging in, alternatively you can put in the email as NormalizedUserName.
    
            migrationBuilder.CreateTable(
                name: "AspNetRoleClaims",
                columns: table => new
                {
                    Id = table.Column<int>(nullable: false)
                        .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
                    ClaimType = table.Column<string>(nullable: true),
                    ClaimValue = table.Column<string>(nullable: true),
                    RoleId = table.Column<string>(nullable: false)
                },
                constraints: table =>
                {
                    table.PrimaryKey("PK_IdentityRoleClaim<string>", x => x.Id);
                    table.ForeignKey(
                        name: "FK_IdentityRoleClaim<string>_IdentityRole_RoleId",
                        column: x => x.RoleId,
                        principalTable: "AspNetRoles",
                        principalColumn: "Id",
                        onDelete: ReferentialAction.Cascade);
                });
    
            migrationBuilder.AddColumn<string>(name: "ProviderDisplayName", table: "AspNetUserLogins", nullable: true);
    
            migrationBuilder.DropIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles");
            migrationBuilder.CreateIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles",
                column: "NormalizedName");
    
            migrationBuilder.CreateIndex(
                name: "EmailIndex",
                table: "AspNetUsers",
                column: "NormalizedEmail");
    
            migrationBuilder.DropIndex(
                name: "UserNameIndex",
                table: "AspNetUsers");
            migrationBuilder.CreateIndex(
                name: "UserNameIndex",
                table: "AspNetUsers",
                column: "NormalizedUserName");
        }
    
        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId", "AspNetUserRoles");
            migrationBuilder.DropPrimaryKey("PK_dbo.AspNetRoles", "AspNetRoles");
    
            migrationBuilder.Sql(@"ALTER TABLE [AspNetRoles]
                                   ALTER COLUMN [Id] NVARCHAR(128) NOT NULL
            ALTER TABLE[AspNetUserRoles]
            ALTER COLUMN[RoleId] NVARCHAR(128) NOT NULL");
    
            migrationBuilder.AddPrimaryKey("PK_dbo.AspNetRoles", "AspNetRoles", "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId", "AspNetUserRoles", "RoleId", "AspNetRoles", principalColumn: "Id");
    
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId", "AspNetUserClaims");
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId", "AspNetUserLogins");
            migrationBuilder.DropForeignKey("FK_dbo.User_dbo.AspNetUsers_IdentityUser_Id", "User");
            migrationBuilder.DropForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId", "AspNetUserRoles");
            migrationBuilder.DropPrimaryKey("PK_dbo.AspNetUsers", "AspNetUsers");
    
            migrationBuilder.Sql(@"ALTER TABLE [AspNetUsers]
                                   ALTER COLUMN [Id] NVARCHAR(128) NOT NULL
            ALTER TABLE[AspNetUserRoles]
            ALTER COLUMN[UserId] NVARCHAR(128) NOT NULL
    
            ALTER TABLE[User]
            ALTER COLUMN[IdentityUser_Id] NVARCHAR(128) NOT NULL
    
            ALTER TABLE[AspNetUserLogins]
            ALTER COLUMN[UserId] NVARCHAR(128) NOT NULL
    
            ALTER TABLE[AspNetUserClaims]
            ALTER COLUMN[UserId] NVARCHAR(128) NOT NULL");
    
    
            migrationBuilder.AddPrimaryKey("PK_dbo.AspNetUsers", "AspNetUsers", "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId", "AspNetUserRoles", "UserId", "AspNetUsers", principalColumn: "Id");
            migrationBuilder.AddForeignKey("FK_dbo.User_dbo.AspNetUsers_IdentityUser_Id", "User", "IdentityUser_Id", "AspNetUsers", principalColumn: "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId", "AspNetUserLogins", "UserId", "AspNetUsers", principalColumn: "Id");
            migrationBuilder.AddForeignKey("FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId", "AspNetUserClaims", "UserId", "AspNetUsers", principalColumn: "Id");
    
            migrationBuilder.DropTable("AspNetRoleClaims");
    
            migrationBuilder.DropColumn(name: "ConcurrencyStamp", table: "AspNetRoles");
            migrationBuilder.DropColumn(name: "NormalizedName", table: "AspNetRoles");
            migrationBuilder.DropColumn(name: "ConcurrencyStamp", table: "AspNetUsers");
            migrationBuilder.DropColumn(name: "LockoutEnd", table: "AspNetUsers");
            migrationBuilder.DropColumn(name: "NormalizedEmail", table: "AspNetUsers");
            migrationBuilder.DropColumn(name: "NormalizedUserName", table: "AspNetUsers");
            migrationBuilder.DropColumn(name: "ProviderDisplayName", table: "AspNetUserLogins");
    
    
            migrationBuilder.DropIndex(
                 name: "RoleNameIndex",
                 table: "AspNetRoles");
            migrationBuilder.CreateIndex(
                name: "RoleNameIndex",
                table: "AspNetRoles",
                column: "Name");
    
            migrationBuilder.DropIndex(
                name: "EmailIndex",
                table: "AspNetUsers");
    
            migrationBuilder.DropIndex(
                name: "UserNameIndex",
                table: "AspNetUsers");
            migrationBuilder.CreateIndex(
                name: "UserNameIndex",
                table: "AspNetUsers",
                column: "UserName");
    }
    

    关于entity-framework - 如何将数据库架构从 Identity 2.2.0 迁移到 3.0.0-rc1-final,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36345121/

    相关文章:

    asp.net-mvc-4 - ASP.NET MVC4 和 CodeFirst 中的一对多关系

    c# - 从类库项目访问 appsettings.json 文件设置

    c# - 需要从存储库层访问登录用户

    jquery - 如何使用 .net 在 backstretch 中给出文件路径

    c# - 迁移 : No DbContext was found in assembly

    c# - 在 ASP.net MVC 中使用 EF 对象的设计注意事项

    c# - 如何在 Entity Framework 4 Designer 中分配默认值并定义唯一键

    .net - 数据库更新后是否可以删除 EF Core 数据库迁移

    c# - Linq to 实体扩展方法内部查询 (EF6)

    c# - Entity Framework 代码优先迁移后的外来列