0

Ich habe einige Code-First-generierte ASP.NET-Identity-Tabellen, die ich im Standardschema dbo generiert habe. Ich änderte das Schema dieser Tabellen von modelBuilder.HasDefaultSchema("Intranet");Constraint-Namen mit Migration ändern

und anschließend der Anwendung meiner SchemaChange Migration der Datenbank zu aktualisieren:

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

ich jetzt versuchen, eine weitere Migration zu tun, um die Primärschlüsseltypen von Zeichenfolge zu ändern in int .

Mein Problem ist, dass die Migration der Schemaänderung den Namen der Einschränkungen für alle Tabellen nicht geändert hat. So, jetzt habe ich eine Reihe von Constraints mit dem Titel: PK_dbo.AspNetRoles statt PK_Intranet.AspNetRoles und wenn die Migration versucht, diese Primärschlüssel zu löschen, schlägt es fehl, weil es versucht, eine Einschränkung zu löschen, die nicht existiert.

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. 

Ich frage mich, was wäre der beste Weg, um alle Namen dieser Einschränkungen mit einer Migration zu ändern. Wenn wir also aus irgendeinem Grund auf dbo zurückwechseln müssen, können wir die Migration einfach rückgängig machen.

Antwort

0

Ich sah mich am Ende meiner Update-Database -TargetMigration MigrationName Anweisungen die SQL-Anweisungen, die mit dem Schlüsselwort -Verbose ausgeführt wurden, um dies zu lösen.

Ich entfernte alle Fremd-und Primärschlüssel aus jeder Tabelle, dann fügte sie wieder mit den richtigen Namen.

Wo entity-framework versuchte, dies zu tun:

DropForeignKey("Intranet.AspNetUserRoles", "RoleId", "Intranet.AspNetRoles"); 
DropIndex("Intranet.AspNetUserRoles", new[] { "UserId" }); 
DropPrimaryKey("Intranet.AspNetRoles"); 

, die zu diesen SQL Aussagen übersetzt:

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] 

Ich habe dies:

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] 

Also, um ein einzelnes zu ändern Beschränkungsname, den Sie in Ihrer Migration damit enden würden:

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

Wo "Intranet" Ihr neues Schema Name ist "dbo" name das alte Schema ist "Id" ist der Spaltenname "AspNetUserRoles" mit dem Fremdschlüssel der Tabelle ist, und "AspNetRoles" ist Ihr Tisch mit dem Primärschlüssel (den Sie zuerst ändern wollten).

Um die Migrationsmethode Down() zu kümmern, kehren Sie einfach die Schemanamen um.

Hier ist meine neue SchemaChange Migration:

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