В базе уже есть объект с именем "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)
Проверьте текущие базы данных в вашем проекте:
dotnet ef migrations list
Если вы добавили самое новое, удалите его:
dotnet ef migrations remove
Гарантийные выходы этой базы данных должны быть обнаружены в исходном коде:
.cs/.Designer.cs files
Теперь все хорошо. Попробуйте добавить еще раз:
dotnet ef migrations add [new_dbo_name]
Наконец, попробуйте обновить еще раз в базе данных о списке миграции:
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
Это работает.