webentwicklung-frage-antwort-db.com.de

In der Datenbank befindet sich bereits ein Objekt mit dem Namen 'AspNetRoles'

Vor einiger Zeit habe ich eine ASP.NET MVC 5-Website mit der Identity 1.0-Version erstellt und mit diesem Projekt die Identity-Tabellen erstellt. Jetzt muss ich andere Website mit der gleichen Datenbank für die Authentifizierung machen, aber jetzt ist die Identitätsversion 2.0. Wenn ich versuche, mich auf der neuen Website zu authentifizieren, erhalte ich einige Fehler.

Ich versuche, die Datenbank mit dem Migrations-Ansatz zu migrieren, aber es ist verwirrt und ich erhalte diesen Fehler There is already an object named 'AspNetRoles' in the database. wenn ich Update-Database in die PM Konsole eingebe.

Meine Frage ist, wie man am besten dieselbe Datenbank für die Authentifizierung beider Sites verwendet (eine mit der 1.0-Identitätsversion und eine andere mit 2.0). Muss ich die Datenbank wirklich migrieren?

Wenn ja, wie kann ich diesen Fehler beheben, den ich bekomme?

18
gog
Add-Migration InitialMigrations -IgnoreChanges

Dies sollte eine leere "InitialMigration" -Datei erzeugen. Fügen Sie nun die gewünschten Änderungen zur gewünschten Klasse hinzu. Führen Sie nach dem Hinzufügen von Änderungen den Befehl update erneut aus:

update-database -verbose

Jetzt wird die automatische Migration angewendet und die Tabelle wird mit Ihren Änderungen geändert.

Bearbeiten: Hier ist eine Lösung zum Migrieren von Identität 1 nach 2 pgrade von ASP.NET.Identity 1.0 nach 2. Verwenden Sie dieses Handbuch Migration

public override void Up()
    {
        RenameColumn(table: "dbo.AspNetUserClaims", name: "User_Id", newName: "UserId");
        RenameIndex(table: "dbo.AspNetUserClaims", name: "IX_User_Id", newName: "IX_UserId");
        DropPrimaryKey("dbo.AspNetUserLogins");
        AddColumn("dbo.AspNetUsers", "Email", c => c.String(maxLength: 256));
        AddColumn("dbo.AspNetUsers", "EmailConfirmed", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "PhoneNumber", c => c.String()); 
        AddColumn("dbo.AspNetUsers", "PhoneNumberConfirmed", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "TwoFactorEnabled", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "LockoutEndDateUtc", c => c.DateTime());
        AddColumn("dbo.AspNetUsers", "LockoutEnabled", c => c.Boolean(nullable: false));
        AddColumn("dbo.AspNetUsers", "AccessFailedCount", c => c.Int(nullable: false));
        AlterColumn("dbo.AspNetUsers", "UserName", c => c.String(nullable: false, maxLength: 256));
        AlterColumn("dbo.AspNetUsers", "FirstName", c => c.String(nullable: false));
        AlterColumn("dbo.AspNetUsers", "LastName", c => c.String(nullable: false));
        AddColumn("dbo.AspNetUsers", "CreatedDateTime", c => c.DateTime(nullable: false));
        AlterColumn("dbo.AspNetRoles", "Name", c => c.String(nullable: false, maxLength: 256));
        AddPrimaryKey("dbo.AspNetUserLogins", new[] { "LoginProvider", "ProviderKey", "UserId" });
        CreateIndex("dbo.AspNetUsers", "UserName", unique: true, name: "UserNameIndex");
        CreateIndex("dbo.AspNetRoles", "Name", unique: true, name: "RoleNameIndex");
        DropColumn("dbo.AspNetUsers", "Discriminator");
    } 
38

Sie können Migrationen (seit EF6) in zwei separaten Projekten für dieselbe Datenbank verwenden, es darf jedoch keine Überlappung geben. Die Art und Weise, wie Migrationen funktionieren, ist durch ein dbo._MigrationHistory-Tabelle, in der der Kontext gespeichert ist, der die Migration generiert hat, und der Modellstatus Ihrer Anwendung, einschließlich der Identitätsmodelle.

Wenn Sie versuchen, eine Verbindung zu Ihrer zweiten Anwendung herzustellen, werden keine vorherigen Migrationen gefunden. Daher muss die ursprüngliche Migration generiert werden, die Tabellen für die Identitätsmodelle enthält, die sich ebenfalls in ihrem Kontext befinden. Dort liegt Ihr Problem.

Für Identitätszwecke müssen Sie ein Projekt auswählen, um den Master zu erstellen. Dieser verwendet einen Standard IdentityDbContext, in den die Identitätsmodelle migriert werden.

Das andere Projekt muss zum Sklaven gemacht werden, zumindest im Hinblick auf die Nutzung der Identität. Daher müssen Sie in dieser Anwendung mit mindestens zwei Kontexten interagieren. Eine wird eine Unterklasse von IdentityDbContext sein, aber als Datenbank zuerst behandelt:

public class MyIdentityContext : IdentityDbContext<ApplicationUser>
{
    public MyIdentityContext()
        : base("ConnectionStringNameForYourSharedDB")
    {
        Database.SetInitializer<MyIdentityContext>(null);
    }
}

Der andere Kontext ist nur eine reguläre DbContext -Unterklasse, die wie gewohnt migriert wird. Sie müssen dies für jedes andere Projekt wiederholen, das möglicherweise Zugriff auf dieselben Identitätsinformationen aus derselben Datenbank benötigt. Aufgrund des sich wiederholenden Codes, zu dem dies führt (und der Tatsache, dass Ihre Klasse ApplicationUser gemeinsam genutzt werden muss), sollten Sie diesen Code in eine Klassenbibliothek verschieben, auf die jedes Projekt verweisen kann.

11
Chris Pratt

Ich hatte den gleichen Fehler wie unten. Dann habe ich es wie folgt behoben: (.NET Core/EF Core)

  1. Überprüfen Sie die aktuellen Datenbanken in Ihrem Projekt:

    dotnet ef migrations list
    
  2. Wenn das Neueste das ist, was Sie hinzugefügt haben, entfernen Sie es:

    dotnet ef migrations remove
    
  3. Garantieausgaben dieser Datenbank müssen im Quellcode enthalten sein:

    .cs/.Designer.cs Dateien

  4. Jetzt ist es gut. Versuchen Sie erneut, Folgendes hinzuzufügen:

    dotnet ef migrations add [new_dbo_name]
    
  5. Versuchen Sie abschließend erneut, auf der Grundlage der Migrationsliste Folgendes zu aktualisieren:

    dotnet ef database update [First]
    dotnet ef database update [Second]
    ...
    dotnet ef database update [new_dbo_name]
    

Hoffe es ist hilfreich für dich.

0
Mai Nguyen