【问题标题】:How to migrate database schema from Identity 2.2.0 to 3.0.0-rc1-final如何将数据库架构从 Identity 2.2.0 迁移到 3.0.0-rc1-final
【发布时间】:2016-03-31 22:47:52
【问题描述】:

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

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

我将发布我所做的作为答案,但我非常想要灵感或其他方式来完成它。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 它真的有效吗?密码呢?您仍然可以使用相同的密码登录还是需要以某种方式重新生成?
    • 不确定密码,我主要使用外部登录提供程序,仅验证它们有效:)
    【解决方案2】:

    这是一个 SQL 脚本,用于将 Identity 2 数据库转换为 Identity Core(或 Identity 3,如果您愿意)。备注:

    此脚本由 Visual Studio 架构比较工具生成,然后手动修改。该脚本的目标是在不删除 AspNetUsers 表的情况下迁移架构。在此过程中删除并重新创建其他表,并复制数据。如果您对用户表以外的表进行了修改,或者如果您修改了用户表的 PK,您应该相应地修改脚本。与 PK 大小相关的默认架构相比,有几处更改。

    • users 表的 PK 为 NVARCHAR(128),就像它在 Identity 2 中一样,而不是 Identity 3 使用的 NVARCHAR(450)。其他表中的所有关系也都改为NVARCHAR(128)

    • 角色表的 PK 为 NVARCHAR(128)。有几个警告与最大密钥大小超过 900 字节的密钥(包括角色 ID)有关。

    • 仍有一些与登录提供程序具有较长密钥相关的警告,但我认为让 ProviderKey 为 450 个字符是合理的风险,因为实际的外部提供程序可能使用大密钥。请注意,默认的 ASP.NET Identity 3 架构具有更大的主键。

    我最初在此处发布了脚本 - https://github.com/Eirenarch/Identity2to3 如果需要进一步更改或发现错误,我可能会修改此版本。

    PRINT N'Dropping [dbo].[AspNetUserClaims].[IX_UserId]...';
    GO
    DROP INDEX [IX_UserId] ON [dbo].[AspNetUserClaims];
    GO
    
    PRINT N'Dropping [dbo].[AspNetUserLogins].[IX_UserId]...';
    GO
    DROP INDEX [IX_UserId] ON [dbo].[AspNetUserLogins];
    GO
    
    
    PRINT N'Dropping [dbo].[AspNetUserRoles].[IX_RoleId]...';
    GO
    DROP INDEX [IX_RoleId] ON [dbo].[AspNetUserRoles];
    GO
    
    
    PRINT N'Dropping [dbo].[AspNetUserRoles].[IX_UserId]...';
    GO
    DROP INDEX [IX_UserId] ON [dbo].[AspNetUserRoles];
    GO
    
    
    PRINT N'Dropping [dbo].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserRoles] DROP CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId];
    GO
    
    
    PRINT N'Dropping [dbo].[FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserClaims] DROP CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId];
    GO
    
    
    PRINT N'Dropping [dbo].[FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserLogins] DROP CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId];
    GO
    
    
    PRINT N'Dropping [dbo].[FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserRoles] DROP CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId];
    GO
    
    
    PRINT N'Starting rebuilding table [dbo].[AspNetRoles]...';
    GO
    BEGIN TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    SET XACT_ABORT ON;
    
    CREATE TABLE [dbo].[tmp_ms_xx_AspNetRoles] (
        [Id]               NVARCHAR (128) NOT NULL,
        [ConcurrencyStamp] NVARCHAR (MAX) NULL,
        [Name]             NVARCHAR (256) NULL,
        [NormalizedName]   NVARCHAR (256) NULL,
        CONSTRAINT [tmp_ms_xx_constraint_PK_AspNetRoles1] PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    IF EXISTS (SELECT TOP 1 1 
               FROM   [dbo].[AspNetRoles])
        BEGIN
            INSERT INTO [dbo].[tmp_ms_xx_AspNetRoles] ([Id], [Name], [NormalizedName])
            SELECT   [Id],
                     [Name],
                     UPPER([Name])
            FROM     [dbo].[AspNetRoles]
            ORDER BY [Id] ASC;
        END
    
    DROP TABLE [dbo].[AspNetRoles];
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_AspNetRoles]', N'AspNetRoles';
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_PK_AspNetRoles1]', N'PK_AspNetRoles', N'OBJECT';
    
    COMMIT TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
    
    GO
    PRINT N'Creating [dbo].[AspNetRoles].[RoleNameIndex]...';
    
    
    GO
    CREATE NONCLUSTERED INDEX [RoleNameIndex]
        ON [dbo].[AspNetRoles]([NormalizedName] ASC);
    
    
    GO
    PRINT N'Starting rebuilding table [dbo].[AspNetUserClaims]...';
    
    
    GO
    BEGIN TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    SET XACT_ABORT ON;
    
    CREATE TABLE [dbo].[tmp_ms_xx_AspNetUserClaims] (
        [Id]         INT            IDENTITY (1, 1) NOT NULL,
        [ClaimType]  NVARCHAR (MAX) NULL,
        [ClaimValue] NVARCHAR (MAX) NULL,
        [UserId]     NVARCHAR (128) NOT NULL,
        CONSTRAINT [tmp_ms_xx_constraint_PK_AspNetUserClaims1] PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    
    IF EXISTS (SELECT TOP 1 1 
               FROM   [dbo].[AspNetUserClaims])
        BEGIN
            SET IDENTITY_INSERT [dbo].[tmp_ms_xx_AspNetUserClaims] ON;
            INSERT INTO [dbo].[tmp_ms_xx_AspNetUserClaims] ([Id], [UserId], [ClaimType], [ClaimValue])
            SELECT   [Id],
                     [UserId],
                     [ClaimType],
                     [ClaimValue]
            FROM     [dbo].[AspNetUserClaims]
            ORDER BY [Id] ASC;
            SET IDENTITY_INSERT [dbo].[tmp_ms_xx_AspNetUserClaims] OFF;
        END
    
    DROP TABLE [dbo].[AspNetUserClaims];
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_AspNetUserClaims]', N'AspNetUserClaims';
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_PK_AspNetUserClaims1]', N'PK_AspNetUserClaims', N'OBJECT';
    
    COMMIT TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
    
    GO
    PRINT N'Creating [dbo].[AspNetUserClaims].[IX_AspNetUserClaims_UserId]...';
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_AspNetUserClaims_UserId]
        ON [dbo].[AspNetUserClaims]([UserId] ASC);
    
    
    GO
    PRINT N'Starting rebuilding table [dbo].[AspNetUserLogins]...';
    
    
    GO
    BEGIN TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    SET XACT_ABORT ON;
    
    CREATE TABLE [dbo].[tmp_ms_xx_AspNetUserLogins] (
        [LoginProvider]       NVARCHAR (128) NOT NULL,
        [ProviderKey]         NVARCHAR (450) NOT NULL,
        [ProviderDisplayName] NVARCHAR (MAX) NULL,
        [UserId]              NVARCHAR (128) NOT NULL,
        CONSTRAINT [tmp_ms_xx_constraint_PK_AspNetUserLogins1] PRIMARY KEY CLUSTERED ([LoginProvider] ASC, [ProviderKey] ASC)
    );
    
    IF EXISTS (SELECT TOP 1 1 
               FROM   [dbo].[AspNetUserLogins])
        BEGIN
            INSERT INTO [dbo].[tmp_ms_xx_AspNetUserLogins] ([LoginProvider], [ProviderKey], [ProviderDisplayName], [UserId])
            SELECT   [LoginProvider],
                     [ProviderKey],
                     [LoginProvider] AS [ProviderDisplayName],
                     [UserId]
            FROM     [dbo].[AspNetUserLogins]
            ORDER BY [LoginProvider] ASC, [ProviderKey] ASC;
        END
    
    DROP TABLE [dbo].[AspNetUserLogins];
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_AspNetUserLogins]', N'AspNetUserLogins';
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_PK_AspNetUserLogins1]', N'PK_AspNetUserLogins', N'OBJECT';
    
    COMMIT TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
    
    GO
    PRINT N'Creating [dbo].[AspNetUserLogins].[IX_AspNetUserLogins_UserId]...';
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_AspNetUserLogins_UserId]
        ON [dbo].[AspNetUserLogins]([UserId] ASC);
    
    
    GO
    PRINT N'Starting rebuilding table [dbo].[AspNetUserRoles]...';
    
    
    GO
    BEGIN TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    SET XACT_ABORT ON;
    
    CREATE TABLE [dbo].[tmp_ms_xx_AspNetUserRoles] (
        [UserId] NVARCHAR (128) NOT NULL,
        [RoleId] NVARCHAR (128) NOT NULL,
        CONSTRAINT [tmp_ms_xx_constraint_PK_AspNetUserRoles1] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC)
    );
    
    IF EXISTS (SELECT TOP 1 1 
               FROM   [dbo].[AspNetUserRoles])
        BEGIN
            INSERT INTO [dbo].[tmp_ms_xx_AspNetUserRoles] ([UserId], [RoleId])
            SELECT   [UserId],
                     [RoleId]
            FROM     [dbo].[AspNetUserRoles]
            ORDER BY [UserId] ASC, [RoleId] ASC;
        END
    
    DROP TABLE [dbo].[AspNetUserRoles];
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_AspNetUserRoles]', N'AspNetUserRoles';
    
    EXECUTE sp_rename N'[dbo].[tmp_ms_xx_constraint_PK_AspNetUserRoles1]', N'PK_AspNetUserRoles', N'OBJECT';
    
    COMMIT TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
    
    GO
    PRINT N'Creating [dbo].[AspNetUserRoles].[IX_AspNetUserRoles_RoleId]...';
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_AspNetUserRoles_RoleId]
        ON [dbo].[AspNetUserRoles]([RoleId] ASC);
    
    
    GO
    PRINT N'Creating [dbo].[AspNetUserRoles].[IX_AspNetUserRoles_UserId]...';
    
    
    GO
    CREATE NONCLUSTERED INDEX [IX_AspNetUserRoles_UserId]
        ON [dbo].[AspNetUserRoles]([UserId] ASC);
    
    
    GO
    
    -- CHANGE THE REST OF THE SCRIPT! We should NOT drop AspNetUsers
    PRINT N'Starting rebuilding table [dbo].[AspNetUsers]...';
    
    
    GO
    BEGIN TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    
    SET XACT_ABORT ON;
    
    ALTER TABLE [dbo].[AspNetUsers]
    ADD [ConcurrencyStamp] NVARCHAR(MAX) NULL
    GO
    
    ALTER TABLE [dbo].[AspNetUsers]
    ADD [LockoutEnd] DATETIMEOFFSET(7) NULL
    GO
    
    ALTER TABLE [dbo].[AspNetUsers]
    ADD [NormalizedEmail] NVARCHAR(256) NULL
    GO
    
    ALTER TABLE [dbo].[AspNetUsers]
    ADD [NormalizedUserName] NVARCHAR(256) NULL
    GO
    
    DROP INDEX [UserNameIndex] ON [dbo].[AspNetUsers];
    GO
    
    UPDATE [dbo].[AspNetUsers]
    SET [NormalizedEmail] = UPPER([Email]), [NormalizedUserName] = UPPER([UserName])
    GO
    
    COMMIT TRANSACTION;
    
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
    GO
    
    PRINT N'Creating [dbo].[AspNetUsers].[EmailIndex]...';
    GO
    CREATE NONCLUSTERED INDEX [EmailIndex]
        ON [dbo].[AspNetUsers]([NormalizedEmail] ASC);
    GO
    
    
    PRINT N'Creating [dbo].[AspNetUsers].[UserNameIndex]...';
    GO
    CREATE UNIQUE NONCLUSTERED INDEX [UserNameIndex]
        ON [dbo].[AspNetUsers]([NormalizedUserName] ASC);
    GO
    
    
    PRINT N'Creating [dbo].[AspNetRoleClaims]...';
    GO
    CREATE TABLE [dbo].[AspNetRoleClaims] (
        [Id]         INT            IDENTITY (1, 1) NOT NULL,
        [ClaimType]  NVARCHAR (MAX) NULL,
        [ClaimValue] NVARCHAR (MAX) NULL,
        [RoleId]     NVARCHAR (128) NOT NULL,
        CONSTRAINT [PK_AspNetRoleClaims] PRIMARY KEY CLUSTERED ([Id] ASC)
    );
    GO
    
    
    PRINT N'Creating [dbo].[AspNetRoleClaims].[IX_AspNetRoleClaims_RoleId]...';
    GO
    CREATE NONCLUSTERED INDEX [IX_AspNetRoleClaims_RoleId]
        ON [dbo].[AspNetRoleClaims]([RoleId] ASC);
    GO
    
    
    PRINT N'Creating [dbo].[AspNetUserTokens]...';
    GO
    CREATE TABLE [dbo].[AspNetUserTokens] (
        [UserId]        NVARCHAR (128) NOT NULL,
        [LoginProvider] NVARCHAR (128) NOT NULL,
        [Name]          NVARCHAR (450) NOT NULL,
        [Value]         NVARCHAR (MAX) NULL,
        CONSTRAINT [PK_AspNetUserTokens] PRIMARY KEY CLUSTERED ([UserId] ASC, [LoginProvider] ASC, [Name] ASC)
    );
    GO
    
    
    PRINT N'Creating [dbo].[FK_AspNetUserClaims_AspNetUsers_UserId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserClaims] WITH NOCHECK
        ADD CONSTRAINT [FK_AspNetUserClaims_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE;
    GO
    
    PRINT N'Creating [dbo].[FK_AspNetUserLogins_AspNetUsers_UserId]...';
    GO
    
    
    ALTER TABLE [dbo].[AspNetUserLogins] WITH NOCHECK
        ADD CONSTRAINT [FK_AspNetUserLogins_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE;
    GO
    
    
    PRINT N'Creating [dbo].[FK_AspNetUserRoles_AspNetRoles_RoleId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserRoles] WITH NOCHECK
        ADD CONSTRAINT [FK_AspNetUserRoles_AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE;
    GO
    
    
    PRINT N'Creating [dbo].[FK_AspNetUserRoles_AspNetUsers_UserId]...';
    GO
    ALTER TABLE [dbo].[AspNetUserRoles] WITH NOCHECK
        ADD CONSTRAINT [FK_AspNetUserRoles_AspNetUsers_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE;
    GO
    
    
    PRINT N'Creating [dbo].[FK_AspNetRoleClaims_AspNetRoles_RoleId]...';
    GO
    ALTER TABLE [dbo].[AspNetRoleClaims] WITH NOCHECK
        ADD CONSTRAINT [FK_AspNetRoleClaims_AspNetRoles_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE;
    GO
    
    
    PRINT N'Checking existing data against newly created constraints';
    GO
    ALTER TABLE [dbo].[AspNetUserClaims] WITH CHECK CHECK CONSTRAINT [FK_AspNetUserClaims_AspNetUsers_UserId];
    
    ALTER TABLE [dbo].[AspNetUserLogins] WITH CHECK CHECK CONSTRAINT [FK_AspNetUserLogins_AspNetUsers_UserId];
    
    ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK CHECK CONSTRAINT [FK_AspNetUserRoles_AspNetRoles_RoleId];
    
    ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK CHECK CONSTRAINT [FK_AspNetUserRoles_AspNetUsers_UserId];
    
    ALTER TABLE [dbo].[AspNetRoleClaims] WITH CHECK CHECK CONSTRAINT [FK_AspNetRoleClaims_AspNetRoles_RoleId];
    
    
    GO
    PRINT N'Update complete.';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2023-01-12
      • 2011-08-08
      • 2011-01-29
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多