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

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

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

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

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

2 ответов


Add-Migration InitialMigrations -IgnoreChanges

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

update-database -verbose

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

Edit: Вот решение для переноса идентификатора 1 в 2 обновление с ASP.Сеть.Идентичность 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");
    } 

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

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

для целей идентификации вам нужно выбрать один проект, чтобы сделать мастер. Этот будет использовать стандартный IdentityDbContext куда будут перенесены модели удостоверений.

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

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

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