0

我有一些Code-First生成的ASP.NET身份表,我在默認的dbo模式中生成。通過遷移更改約束名稱

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

我現在試圖做一次遷移從字符串更改主鍵類型爲int:我用modelBuilder.HasDefaultSchema("Intranet");

,然後將我的SchemaChange遷移到更新數據庫中更改這些表的模式。

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,無論出於何種原因,我們都可以回滾遷移。

回答

0

我最終看到了使用-Verbose關鍵字在我的Update-Database -TargetMigration MigrationName語句末尾執行的SQL語句來解決這個問題。

我刪除了每個表中的所有外鍵和主鍵,然後使用正確的名稱將它們添加回來。

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

其中「內聯網」是你的新模式名,「DBO」是舊模式的名字,「ID」是列名,「AspNetUserRoles」與外鍵的表,而「AspNetRoles」被你的表與主鍵(你試圖改變的第一個地方)。

要照顧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); 
}