web-dev-qa-db-ja.com

データベースに「AspNetRoles」という名前のオブジェクトが既にあります

少し前に、Identity 1.0バージョンでASP.NET MVC 5 Webサイトを作成し、このプロジェクトでIdentityテーブルを作成しました。現在、認証に同じデータベースを使用して他のWebサイトを作成する必要がありますが、Identityバージョンは2.0です。そのため、新しいWebサイトで認証しようとすると、エラーが発生します。

移行アプローチを使用してデータベースを移行しようとしていますが、混乱し、このエラーが発生していますThere is already an object named 'AspNetRoles' in the database. PMコンソールでUpdate-Databaseと入力すると。

私の質問は、両方のサイトの認証に同じデータベースを使用する最良の方法はどれですか(1.0 IDバージョンを使用するサイトと2.0を使用するサイト)。本当にデータベースを移行する必要がありますか?

はいの場合、どうすればこのエラーを解決できますか?

18
gog
Add-Migration InitialMigrations -IgnoreChanges

これにより、空の「InitialMigration」ファイルが生成されます。次に、目的のクラスに必要な変更を追加します。変更が追加されたら、更新コマンドを再度実行します。

update-database -verbose

これで自動移行が適用され、変更に応じてテーブルが変更されます。

Edit:ID 1を2に移行するソリューションがあります ASP.NET.Identity 1.0から2.0へのアップグレード このマニュアルを使用移行

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

(EF6以降)同じデータベースの2つの別々のプロジェクトで移行を使用できますが、重複することはできません。移行の仕組みは、dbo._MigrationHistory移行を生成したコンテキストと、IDモデルを含むアプリケーションのモデル状態を格納するテーブル。

2番目のアプリケーションを接続しようとすると、以前の移行は検出されないため、初期移行を生成する必要があります。初期移行には、コンテキスト内のIdentityモデルのテーブルも含まれます。それはあなたの問題があるところです。

アイデンティティの目的で、マスターを作成するプロジェクトを1つ選択する必要があります。これは、IDモデルが移行される標準のIdentityDbContextを利用します。

他のプロジェクトは、少なくともIdentityの利用に関しては、スレーブにする必要があります。そのため、このアプリケーションでは少なくとも2つのコンテキストと対話する必要があります。 1つはIdentityDbContextのサブクラスですが、データベース優先として扱われます:

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

他のコンテキストは、通常のDbContextサブクラスになり、通常どおりに移行されます。同じデータベースから同じID情報にアクセスする必要がある他のプロジェクトについて、これを繰り返す必要があります。また、コードの繰り返しのため、これは(およびApplicationUserクラスを共有する必要があるという事実につながる)各プロジェクトが参照できるクラスライブラリにこのコードを移動する必要があります。

11
Chris Pratt

以下と同じバグに直面しました。次に、以下のように修正しました:(.NET Core/EF Core)

  1. プロジェクト内の現在のデータベースを確認します。

    dotnet ef migrations list
    
  2. 最新のものが追加したものである場合は、削除します。

    dotnet ef migrations remove
    
  3. このデータベースの出力は、ソースコードで保証する必要があります。

    .cs/.Designer.csファイル

  4. 今は大丈夫です。再追加してみてください:

    dotnet ef migrations add [new_dbo_name]
    
  5. 最後に、移行リストの配置に基づいて、再度更新を試みます。

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

お役に立てば幸いです。

0
Mai Nguyen