В базе уже есть объект с именем "AspNetRoles"

Некоторое время назад я создал веб-сайт ASP.NET MVC 5 с версией Identity 1.0, и я создал таблицы Identity с этим проектом. Теперь мне нужно сделать другой сайт, используя одну и ту же базу данных для аутентификации, но теперь версия Identity 2.0. Поэтому, когда я пытаюсь пройти аутентификацию на новом веб-сайте, я получаю некоторые ошибки.

Я пытаюсь перенести базу данных с помощью подхода Migrations, но его запутал и im получил эту ошибку There is already an object named 'AspNetRoles' in the database., когда я набираю Update-Database в консоли PM.

Мой вопрос в том, как наилучшим образом использовать одну и ту же базу данных для аутентификации обоих сайтов (один использует версию идентификации 1.0 и другую версию 2.0). Мне действительно нужно перенести базу данных?

Если да, как я могу решить эту ошибку, которую я получаю?

Ответы

Ответ 1

Add-Migration InitialMigrations -IgnoreChanges

Это должно сгенерировать пустой файл "InitialMigration". Теперь добавьте любые желаемые изменения в нужный класс. После добавления изменений снова запустите команду обновления:

update-database -verbose

Теперь будет применена автоматическая миграция, и таблица будет изменена с вашими изменениями.

Edit: Вот решение для переноса идентификатора 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");
    } 

Ответ 2

В то время как вы можете (начиная с EF6) использовать миграции в двух отдельных проектах для одной и той же базы данных, не может быть перекрытия. Способ миграции работает через таблицу dbo._MigrationHistory, в которой хранится контекст, который сгенерировал миграцию и состояние модели вашего приложения, которое включает в себя модели Identity.

Когда вы пытаетесь подключить второе приложение, он не обнаруживает никаких предыдущих миграций и, следовательно, должен генерировать первоначальную миграцию, которая будет включать в себя таблицы для моделей Identity, которые также находятся в его контексте. Это где ваша проблема.

Для целей Identity вам нужно выбрать один проект для создания мастера. В этом случае будет использоваться стандартный IdentityDbContext, где будут перенесены модели Identity.

Другой проект нужно будет сделать рабом, по крайней мере, с точки зрения использования Identity. Таким образом, вам нужно будет взаимодействовать, по крайней мере, с двумя контекстами в этом приложении. Один из них будет подклассом IdentityDbContext, но сначала рассматривается как база данных:

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

Другой контекст будет просто обычным подклассом DbContext, который будет перенесен как обычно. Вам нужно будет повторить это для любого другого проекта, которому может потребоваться доступ к той же информации Identity из той же базы данных. Кроме того, из-за повторяющегося кода это приведет к (и тому, что ваш класс ApplicationUser должен быть разделен), вы должны переместить этот код в библиотеку классов, к которой может ссылаться каждый проект.

Ответ 3

Я столкнулся с той же ошибкой, что и ниже. Затем я исправил это, как показано ниже: (.NET Core/EF Core)

  1. Проверьте текущие базы данных в вашем проекте:

    dotnet ef migrations list
    
  2. Если вы добавили самое новое, удалите его:

    dotnet ef migrations remove
    
  3. Гарантийные выходы этой базы данных должны быть обнаружены в исходном коде:

    .cs/.Designer.cs files

  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]
    

Надеюсь, это полезно для вас.

Ответ 4

В файле "appsettings.json" измените имя базы данных

"ConnectionStrings": {
    "DefaultConnection": "Server=DESKTOP-S0S1I;Database=New_name_here;Trusted_Connection=True;"

а затем

add-migration 
update-database

Это работает.