通过迁移更改约束名称
Change constraint names with migration
我在默认 dbo
架构中生成了一些 Code-First 生成的 ASP.NET 身份表。我使用 modelBuilder.HasDefaultSchema("Intranet");
更改了这些表的架构
然后应用我的 SchemaChange 迁移来更新数据库:
public override void Up()
{
MoveTable(name: "dbo.AspNetRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUsers", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserClaims", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserLogins", newSchema: "Intranet");
}
我现在正尝试进行另一次迁移以将主键类型从字符串更改为整型。
public override void Up()
{
DropForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles");
DropForeignKey("Intranet.AspNetUserClaims", "UserId", "Intranet.AspNetUsers");
DropForeignKey("Intranet.AspNetUserLogins", "UserId", "Intranet.AspNetUsers");
DropForeignKey("Intranet.AspNetUserRoles", "UserId", "Intranet.AspNetUsers");
DropIndex("Intranet.AspNetUserRoles", new[] { "UserId" });
DropIndex("Intranet.AspNetUserRoles", new[] { "RoleId" });
DropIndex("Intranet.AspNetUserClaims", new[] { "UserId" });
DropIndex("Intranet.AspNetUserLogins", new[] { "UserId" });
DropPrimaryKey("Intranet.AspNetRoles");
DropPrimaryKey("Intranet.AspNetUserRoles");
DropPrimaryKey("Intranet.AspNetUsers");
DropPrimaryKey("Intranet.AspNetUserLogins");
AlterColumn("Intranet.AspNetRoles", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("Intranet.AspNetUserRoles", "UserId", c => c.Int(nullable: false));
AlterColumn("Intranet.AspNetUserRoles", "RoleId", c => c.Int(nullable: false));
AlterColumn("Intranet.AspNetUsers", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("Intranet.AspNetUserClaims", "UserId", c => c.Int(nullable: false));
AlterColumn("Intranet.AspNetUserLogins", "UserId", c => c.Int(nullable: false));
AddPrimaryKey("Intranet.AspNetRoles", "Id");
AddPrimaryKey("Intranet.AspNetUserRoles", new[] { "UserId", "RoleId" });
AddPrimaryKey("Intranet.AspNetUsers", "Id");
AddPrimaryKey("Intranet.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
CreateIndex("Intranet.AspNetUserRoles", "UserId");
CreateIndex("Intranet.AspNetUserRoles", "RoleId");
CreateIndex("Intranet.AspNetUserClaims", "UserId");
CreateIndex("Intranet.AspNetUserLogins", "UserId");
AddForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserClaims", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserLogins", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserRoles", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
DropColumn("Intranet.AspNetRoles", "Discriminator");
}
我的问题是架构更改迁移没有更改所有表上的约束名称。所以现在我有一堆标题类似的约束: PK_dbo.AspNetRoles
而不是 PK_Intranet.AspNetRoles
并且当迁移尝试删除这些主键时,它失败了,因为它试图删除不存在的约束.
ALTER TABLE [Intranet].[AspNetRoles] DROP CONSTRAINT [PK_Intranet.AspNetRoles]
System.Data.SqlClient.SqlException (0x80131904): 'PK_Intranet.AspNetRoles' is not a constraint.
...
'PK_Intranet.AspNetRoles' is not a constraint.
Could not drop constraint. See previous errors.
我想知道使用迁移更改这些约束的所有名称的最佳方法是什么。这样,如果我们需要回滚到 dbo
,无论出于何种原因,我们都可以回滚迁移。
我最终查看了在我的 Update-Database -TargetMigration MigrationName
语句末尾使用 -Verbose
关键字执行的 SQL 语句来解决这个问题。
我删除了每个 table 中的所有外键和主键,然后用正确的名称将它们添加回来。
entity-framework
试图这样做的地方:
DropForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles");
DropIndex("Intranet.AspNetUserRoles", new[] { "UserId" });
DropPrimaryKey("Intranet.AspNetRoles");
翻译成这些 SQL
语句:
IF object_id(N'[Intranet].[FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]', N'F') IS NOT NULL
ALTER TABLE [Intranet].[AspNetUserRoles] DROP CONSTRAINT [FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]
IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U'))
DROP INDEX [IX_UserId] ON [Intranet].[AspNetUserRoles]
ALTER TABLE [Intranet].[AspNetRoles] DROP CONSTRAINT [PK_Intranet.AspNetRoles]
我这样做了:
IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]', N'F') IS NOT NULL
ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U'))
DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserRoles]
ALTER TABLE[Intranet].[AspNetRoles] DROP CONSTRAINT[PK_dbo.AspNetRoles]
因此,要更改单个约束名称,您最终会在迁移中使用此名称:
Sql("IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]\r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserRoles] \r\n" +
"ALTER TABLE[Intranet].[AspNetRoles] DROP CONSTRAINT[PK_dbo.AspNetRoles]");
AddPrimaryKey("Intranet.AspNetUserRoles", "Id");
CreateIndex("Intranet.AspNetUserRoles", "UserId");
AddForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles", "Id", cascadeDelete: true);
其中 "Intranet" 是您的新架构名称,"dbo" 是旧架构名称,"Id" 是列名称,"AspNetUserRoles" 是 table使用外键,"AspNetRoles" 是您的 table 使用主键(您首先尝试更改的那个)。
要处理 Down()
迁移方法,只需反转架构名称。
这是我的新 SchemaChange 迁移:
public override void Up()
{
MoveTable(name: "dbo.AspNetRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUsers", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserClaims", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserLogins", newSchema: "Intranet");
Sql("IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]\r\n" +
"IF object_id(N'[Intranet].[FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserClaims] DROP CONSTRAINT[FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[Intranet].[FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserLogins] DROP CONSTRAINT[FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_RoleId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_RoleId] ON[Intranet].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserClaims]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserClaims] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserLogins]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserLogins]\r\n" +
"ALTER TABLE[Intranet].[AspNetRoles] DROP CONSTRAINT[PK_dbo.AspNetRoles]\r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[PK_dbo.AspNetUserRoles]\r\n" +
"ALTER TABLE[Intranet].[AspNetUsers] DROP CONSTRAINT[PK_dbo.AspNetUsers]\r\n" +
"ALTER TABLE[Intranet].[AspNetUserLogins] DROP CONSTRAINT[PK_dbo.AspNetUserLogins]\r\n" +
"ALTER TABLE[Intranet].[AspNetUserClaims] DROP CONSTRAINT[PK_dbo.AspNetUserClaims]");
AddPrimaryKey("Intranet.AspNetRoles", "Id");
AddPrimaryKey("Intranet.AspNetUserRoles", new[] { "UserId", "RoleId" });
AddPrimaryKey("Intranet.AspNetUsers", "Id");
AddPrimaryKey("Intranet.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
AddPrimaryKey("Intranet.AspNetUserClaims", "Id");
CreateIndex("Intranet.AspNetUserRoles", "UserId");
CreateIndex("Intranet.AspNetUserRoles", "RoleId");
CreateIndex("Intranet.AspNetUserClaims", "UserId");
CreateIndex("Intranet.AspNetUserLogins", "UserId");
AddForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserClaims", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserLogins", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserRoles", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
}
public override void Down()
{
MoveTable(name: "Intranet.AspNetUserLogins", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetUserClaims", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetUsers", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetUserRoles", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetRoles", newSchema: "dbo");
Sql("IF object_id(N'[dbo].[FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserRoles] DROP CONSTRAINT[FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]\r\n" +
"IF object_id(N'[dbo].[FK_Intranet.AspNetUserClaims_Intranet.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserClaims] DROP CONSTRAINT[FK_Intranet.AspNetUserClaims_Intranet.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[dbo].[FK_Intranet.AspNetUserLogins_Intranet.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserLogins] DROP CONSTRAINT[FK_Intranet.AspNetUserLogins_Intranet.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[dbo].[FK_Intranet.AspNetUserRoles_Intranet.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserRoles] DROP CONSTRAINT[FK_Intranet.AspNetUserRoles_Intranet.AspNetUsers_UserId] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[dbo].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[dbo].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_RoleId' AND object_id = object_id(N'[dbo].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_RoleId] ON[dbo].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[dbo].[AspNetUserClaims]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[dbo].[AspNetUserClaims] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[dbo].[AspNetUserLogins]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[dbo].[AspNetUserLogins]\r\n" +
"ALTER TABLE[dbo].[AspNetRoles] DROP CONSTRAINT[PK_Intranet.AspNetRoles]\r\n" +
"ALTER TABLE[dbo].[AspNetUserRoles] DROP CONSTRAINT[PK_Intranet.AspNetUserRoles]\r\n" +
"ALTER TABLE[dbo].[AspNetUsers] DROP CONSTRAINT[PK_Intranet.AspNetUsers]\r\n" +
"ALTER TABLE[dbo].[AspNetUserLogins] DROP CONSTRAINT[PK_Intranet.AspNetUserLogins]\r\n" +
"ALTER TABLE[dbo].[AspNetUserClaims] DROP CONSTRAINT[PK_Intranet.AspNetUserClaims]");
AddPrimaryKey("dbo.AspNetRoles", "Id");
AddPrimaryKey("dbo.AspNetUserRoles", new[] { "UserId", "RoleId" });
AddPrimaryKey("dbo.AspNetUsers", "Id");
AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
AddPrimaryKey("dbo.AspNetUserClaims", "Id");
CreateIndex("dbo.AspNetUserRoles", "UserId");
CreateIndex("dbo.AspNetUserRoles", "RoleId");
CreateIndex("dbo.AspNetUserClaims", "UserId");
CreateIndex("dbo.AspNetUserLogins", "UserId");
AddForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles", "Id", cascadeDelete: true);
AddForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers", "Id", cascadeDelete: true);
}
我在默认 dbo
架构中生成了一些 Code-First 生成的 ASP.NET 身份表。我使用 modelBuilder.HasDefaultSchema("Intranet");
然后应用我的 SchemaChange 迁移来更新数据库:
public override void Up()
{
MoveTable(name: "dbo.AspNetRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUsers", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserClaims", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserLogins", newSchema: "Intranet");
}
我现在正尝试进行另一次迁移以将主键类型从字符串更改为整型。
public override void Up()
{
DropForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles");
DropForeignKey("Intranet.AspNetUserClaims", "UserId", "Intranet.AspNetUsers");
DropForeignKey("Intranet.AspNetUserLogins", "UserId", "Intranet.AspNetUsers");
DropForeignKey("Intranet.AspNetUserRoles", "UserId", "Intranet.AspNetUsers");
DropIndex("Intranet.AspNetUserRoles", new[] { "UserId" });
DropIndex("Intranet.AspNetUserRoles", new[] { "RoleId" });
DropIndex("Intranet.AspNetUserClaims", new[] { "UserId" });
DropIndex("Intranet.AspNetUserLogins", new[] { "UserId" });
DropPrimaryKey("Intranet.AspNetRoles");
DropPrimaryKey("Intranet.AspNetUserRoles");
DropPrimaryKey("Intranet.AspNetUsers");
DropPrimaryKey("Intranet.AspNetUserLogins");
AlterColumn("Intranet.AspNetRoles", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("Intranet.AspNetUserRoles", "UserId", c => c.Int(nullable: false));
AlterColumn("Intranet.AspNetUserRoles", "RoleId", c => c.Int(nullable: false));
AlterColumn("Intranet.AspNetUsers", "Id", c => c.Int(nullable: false, identity: true));
AlterColumn("Intranet.AspNetUserClaims", "UserId", c => c.Int(nullable: false));
AlterColumn("Intranet.AspNetUserLogins", "UserId", c => c.Int(nullable: false));
AddPrimaryKey("Intranet.AspNetRoles", "Id");
AddPrimaryKey("Intranet.AspNetUserRoles", new[] { "UserId", "RoleId" });
AddPrimaryKey("Intranet.AspNetUsers", "Id");
AddPrimaryKey("Intranet.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
CreateIndex("Intranet.AspNetUserRoles", "UserId");
CreateIndex("Intranet.AspNetUserRoles", "RoleId");
CreateIndex("Intranet.AspNetUserClaims", "UserId");
CreateIndex("Intranet.AspNetUserLogins", "UserId");
AddForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserClaims", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserLogins", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserRoles", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
DropColumn("Intranet.AspNetRoles", "Discriminator");
}
我的问题是架构更改迁移没有更改所有表上的约束名称。所以现在我有一堆标题类似的约束: PK_dbo.AspNetRoles
而不是 PK_Intranet.AspNetRoles
并且当迁移尝试删除这些主键时,它失败了,因为它试图删除不存在的约束.
ALTER TABLE [Intranet].[AspNetRoles] DROP CONSTRAINT [PK_Intranet.AspNetRoles]
System.Data.SqlClient.SqlException (0x80131904): 'PK_Intranet.AspNetRoles' is not a constraint.
...
'PK_Intranet.AspNetRoles' is not a constraint.
Could not drop constraint. See previous errors.
我想知道使用迁移更改这些约束的所有名称的最佳方法是什么。这样,如果我们需要回滚到 dbo
,无论出于何种原因,我们都可以回滚迁移。
我最终查看了在我的 Update-Database -TargetMigration MigrationName
语句末尾使用 -Verbose
关键字执行的 SQL 语句来解决这个问题。
我删除了每个 table 中的所有外键和主键,然后用正确的名称将它们添加回来。
entity-framework
试图这样做的地方:
DropForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles");
DropIndex("Intranet.AspNetUserRoles", new[] { "UserId" });
DropPrimaryKey("Intranet.AspNetRoles");
翻译成这些 SQL
语句:
IF object_id(N'[Intranet].[FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]', N'F') IS NOT NULL
ALTER TABLE [Intranet].[AspNetUserRoles] DROP CONSTRAINT [FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]
IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U'))
DROP INDEX [IX_UserId] ON [Intranet].[AspNetUserRoles]
ALTER TABLE [Intranet].[AspNetRoles] DROP CONSTRAINT [PK_Intranet.AspNetRoles]
我这样做了:
IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]', N'F') IS NOT NULL
ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U'))
DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserRoles]
ALTER TABLE[Intranet].[AspNetRoles] DROP CONSTRAINT[PK_dbo.AspNetRoles]
因此,要更改单个约束名称,您最终会在迁移中使用此名称:
Sql("IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]\r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserRoles] \r\n" +
"ALTER TABLE[Intranet].[AspNetRoles] DROP CONSTRAINT[PK_dbo.AspNetRoles]");
AddPrimaryKey("Intranet.AspNetUserRoles", "Id");
CreateIndex("Intranet.AspNetUserRoles", "UserId");
AddForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles", "Id", cascadeDelete: true);
其中 "Intranet" 是您的新架构名称,"dbo" 是旧架构名称,"Id" 是列名称,"AspNetUserRoles" 是 table使用外键,"AspNetRoles" 是您的 table 使用主键(您首先尝试更改的那个)。
要处理 Down()
迁移方法,只需反转架构名称。
这是我的新 SchemaChange 迁移:
public override void Up()
{
MoveTable(name: "dbo.AspNetRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserRoles", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUsers", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserClaims", newSchema: "Intranet");
MoveTable(name: "dbo.AspNetUserLogins", newSchema: "Intranet");
Sql("IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]\r\n" +
"IF object_id(N'[Intranet].[FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserClaims] DROP CONSTRAINT[FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[Intranet].[FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserLogins] DROP CONSTRAINT[FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[Intranet].[FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_RoleId' AND object_id = object_id(N'[Intranet].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_RoleId] ON[Intranet].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserClaims]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserClaims] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[Intranet].[AspNetUserLogins]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[Intranet].[AspNetUserLogins]\r\n" +
"ALTER TABLE[Intranet].[AspNetRoles] DROP CONSTRAINT[PK_dbo.AspNetRoles]\r\n" +
"ALTER TABLE[Intranet].[AspNetUserRoles] DROP CONSTRAINT[PK_dbo.AspNetUserRoles]\r\n" +
"ALTER TABLE[Intranet].[AspNetUsers] DROP CONSTRAINT[PK_dbo.AspNetUsers]\r\n" +
"ALTER TABLE[Intranet].[AspNetUserLogins] DROP CONSTRAINT[PK_dbo.AspNetUserLogins]\r\n" +
"ALTER TABLE[Intranet].[AspNetUserClaims] DROP CONSTRAINT[PK_dbo.AspNetUserClaims]");
AddPrimaryKey("Intranet.AspNetRoles", "Id");
AddPrimaryKey("Intranet.AspNetUserRoles", new[] { "UserId", "RoleId" });
AddPrimaryKey("Intranet.AspNetUsers", "Id");
AddPrimaryKey("Intranet.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
AddPrimaryKey("Intranet.AspNetUserClaims", "Id");
CreateIndex("Intranet.AspNetUserRoles", "UserId");
CreateIndex("Intranet.AspNetUserRoles", "RoleId");
CreateIndex("Intranet.AspNetUserClaims", "UserId");
CreateIndex("Intranet.AspNetUserLogins", "UserId");
AddForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserClaims", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserLogins", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("Intranet.AspNetUserRoles", "UserId", "Intranet.AspNetUsers", "Id", cascadeDelete: true);
}
public override void Down()
{
MoveTable(name: "Intranet.AspNetUserLogins", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetUserClaims", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetUsers", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetUserRoles", newSchema: "dbo");
MoveTable(name: "Intranet.AspNetRoles", newSchema: "dbo");
Sql("IF object_id(N'[dbo].[FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserRoles] DROP CONSTRAINT[FK_Intranet.AspNetUserRoles_Intranet.AspNetRoles_RoleId]\r\n" +
"IF object_id(N'[dbo].[FK_Intranet.AspNetUserClaims_Intranet.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserClaims] DROP CONSTRAINT[FK_Intranet.AspNetUserClaims_Intranet.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[dbo].[FK_Intranet.AspNetUserLogins_Intranet.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserLogins] DROP CONSTRAINT[FK_Intranet.AspNetUserLogins_Intranet.AspNetUsers_UserId] \r\n" +
"IF object_id(N'[dbo].[FK_Intranet.AspNetUserRoles_Intranet.AspNetUsers_UserId]', N'F') IS NOT NULL \r\n" +
"ALTER TABLE[dbo].[AspNetUserRoles] DROP CONSTRAINT[FK_Intranet.AspNetUserRoles_Intranet.AspNetUsers_UserId] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[dbo].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[dbo].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_RoleId' AND object_id = object_id(N'[dbo].[AspNetUserRoles]', N'U')) \r\n" +
"DROP INDEX[IX_RoleId] ON[dbo].[AspNetUserRoles] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[dbo].[AspNetUserClaims]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[dbo].[AspNetUserClaims] \r\n" +
"IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_UserId' AND object_id = object_id(N'[dbo].[AspNetUserLogins]', N'U')) \r\n" +
"DROP INDEX[IX_UserId] ON[dbo].[AspNetUserLogins]\r\n" +
"ALTER TABLE[dbo].[AspNetRoles] DROP CONSTRAINT[PK_Intranet.AspNetRoles]\r\n" +
"ALTER TABLE[dbo].[AspNetUserRoles] DROP CONSTRAINT[PK_Intranet.AspNetUserRoles]\r\n" +
"ALTER TABLE[dbo].[AspNetUsers] DROP CONSTRAINT[PK_Intranet.AspNetUsers]\r\n" +
"ALTER TABLE[dbo].[AspNetUserLogins] DROP CONSTRAINT[PK_Intranet.AspNetUserLogins]\r\n" +
"ALTER TABLE[dbo].[AspNetUserClaims] DROP CONSTRAINT[PK_Intranet.AspNetUserClaims]");
AddPrimaryKey("dbo.AspNetRoles", "Id");
AddPrimaryKey("dbo.AspNetUserRoles", new[] { "UserId", "RoleId" });
AddPrimaryKey("dbo.AspNetUsers", "Id");
AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
AddPrimaryKey("dbo.AspNetUserClaims", "Id");
CreateIndex("dbo.AspNetUserRoles", "UserId");
CreateIndex("dbo.AspNetUserRoles", "RoleId");
CreateIndex("dbo.AspNetUserClaims", "UserId");
CreateIndex("dbo.AspNetUserLogins", "UserId");
AddForeignKey("dbo.AspNetUserRoles", "RoleId", "dbo.AspNetRoles", "Id", cascadeDelete: true);
AddForeignKey("dbo.AspNetUserClaims", "UserId", "dbo.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("dbo.AspNetUserLogins", "UserId", "dbo.AspNetUsers", "Id", cascadeDelete: true);
AddForeignKey("dbo.AspNetUserRoles", "UserId", "dbo.AspNetUsers", "Id", cascadeDelete: true);
}