前一段时间,我创建了一个带有Identity 1.0版本的ASP.NET MVC 5网站,我用这个项目创建了Identity表。现在我必须让其他网站使用相同的数据库进行身份验证,但现在身份版本是2.0。 因此,当我尝试在新网站中进行身份验证时,我会遇到一些错误。
我尝试使用迁移方法迁移数据库,但是当我在PM控制台中键入Update-Database时,它很困惑并且我得到了这个错误There is already an object named 'AspNetRoles' in the database.
。
我的问题是,如何使用相同的数据库来验证两个站点(一个使用1.0身份版本,另一个使用2.0)。我真的需要迁移数据库吗?
如果是,我怎样才能解决这个错误?
答案 0 :(得分:37)
Add-Migration InitialMigrations -IgnoreChanges
这应该会产生一个空白" InitialMigration"文件。现在,将所需的更改添加到所需的类中。添加更改后,再次运行update命令:
update-database -verbose
现在将应用自动迁移,表格将随您的更改而更改。
修改强> 以下是将身份1迁移到2 Upgrading from ASP.NET.Identity 1.0 to 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");
}
答案 1 :(得分:11)
虽然您可以(因为EF6)在同一个数据库的两个单独项目中使用迁移,但不能有任何重叠。迁移的工作方式是通过dbo._MigrationHistory
表,该表存储生成迁移的上下文和应用程序的模型状态,其中包括Identity模型。
当您尝试连接第二个应用程序时,它找不到先前的迁移,因此需要生成它的初始迁移,其中将包括Identity模型的表,这些表也在其上下文中。这就是问题所在。
出于身份的目的,您需要选择一个项目来制作主人。这个将使用标准IdentityDbContext
来迁移身份模型。
另一个项目需要成为奴隶,至少在利用身份方面。因此,您需要在此应用程序中与至少两个上下文进行交互。一个将是IdentityDbContext
的子类,但被视为数据库优先:
public class MyIdentityContext : IdentityDbContext<ApplicationUser>
{
public MyIdentityContext()
: base("ConnectionStringNameForYourSharedDB")
{
Database.SetInitializer<MyIdentityContext>(null);
}
}
其他上下文将只是一个常规DbContext
子类,将正常迁移。您需要为可能需要从同一数据库访问相同身份信息的任何其他项目重复此操作。此外,由于重复的代码将导致(以及您的ApplicationUser
类需要共享的事实),您应该将此代码移动到每个项目可以引用的类库中。
答案 2 :(得分:1)
首先,我们必须删除新迁移的迁移 dotnet ef迁移删除-s .. \ InvoiceManagement \
然后删除迁移文件夹中的* .Designer.cs文件
最后 dotnet ef数据库更新-s .. \ InvoiceManagement \ -s表示启动项目(webApi) 请记住,此代码应在DBcontext文件包含文件夹路径中使用。 该代码在webapi的vscode中使用。
答案 3 :(得分:1)
对我来说,无法通过添加空迁移来解决此问题。我的问题是__EFMigrationsHistory表已手动清除。结果,context.Database.Migrate()
方法认为它必须应用所有丢失的迁移(__EFMigrationsHistory中的条目丢失)。只需在db表中添加所有缺少的迁移,它就可以再次工作。
答案 4 :(得分:0)
我遇到了以下相同的错误。然后我将其修复如下:(.NET Core / EF Core)
检查项目中的当前数据库:
dotnet ef migrations list
如果最新添加的内容,则将其删除:
dotnet ef migrations remove
此数据库的保证输出必须在源代码中删除:
.cs / .Designer.cs文件
现在可以了。尝试重新添加:
dotnet ef migrations add [new_dbo_name]
最后,根据迁移列表,尝试再次更新:
dotnet ef database update [First]
dotnet ef database update [Second]
...
dotnet ef database update [new_dbo_name]
希望对您有帮助。
答案 5 :(得分:0)
在“ appsettings.json”文件中,更改数据库名称
"ConnectionStrings": {
"DefaultConnection": "Server=DESKTOP-S0S1I;Database=New_name_here;Trusted_Connection=True;"
然后
add-migration
update-database
有效。