前段时间,我创建了一个ASP。NET MVC 5网站的Identity 1.0版本,我创建了这个项目的Identity表。现在我必须使其他网站使用相同的数据库进行身份验证,但现在的身份版本是2.0。因此,当我尝试在新网站进行身份验证时,我得到一些错误。
我试图使用迁移方法迁移数据库,但它很混乱,当我在PM控制台上输入Update-Database时,我得到了这个错误There is already an object named 'AspNetRoles' in the database.
。
我的问题是,如何使用相同的数据库对两个站点进行身份验证(一个使用1.0身份版本,另一个使用2.0)。我真的需要迁移数据库吗?
如果是,我该如何解决我得到的这个错误?
Add-Migration InitialMigrations -IgnoreChanges
这会生成一个空白的"InitialMigration"文件。现在,向您想要的类添加任何所需的更改。一旦添加了更改,再次运行update命令:
update-database -verbose
现在将应用自动迁移,并且表将随着您的更改而更改。
编辑:下面是将身份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");
}
虽然您可以(从EF6开始)在同一个数据库的两个独立项目中使用迁移,但不能有任何重叠。迁移工作的方式是通过一个dbo._MigrationHistory
表,该表存储生成迁移的上下文和应用程序的模型状态,其中包括Identity模型。
当您尝试连接第二个应用程序时,它没有发现以前的迁移,因此需要生成它的初始迁移,其中将包括Identity模型的表,这些表也在其上下文中。这就是你的问题所在。
对于Identity,您需要选择一个项目来创建master。这将使用标准的IdentityDbContext
,其中Identity模型将被迁移。
其他项目将需要成为一个奴隶,至少在使用Identity方面。因此,您需要在此应用程序中与至少两个上下文进行交互。一个将是IdentityDbContext
的子类,但被视为数据库优先:
public class MyIdentityContext : IdentityDbContext<ApplicationUser>
{
public MyIdentityContext()
: base("ConnectionStringNameForYourSharedDB")
{
Database.SetInitializer<MyIdentityContext>(null);
}
}
另一个上下文将只是一个常规的DbContext
子类,它将被正常迁移。对于可能需要访问来自同一数据库的相同Identity信息的任何其他项目,您都需要重复此操作。此外,由于重复的代码将导致(以及您的ApplicationUser
类需要共享的事实),您应该将此代码移动到每个项目都可以引用的类库中。
在"appsettings. "修改数据库名称
"ConnectionStrings": {
"DefaultConnection": "Server=DESKTOP-S0S1I;Database=New_name_here;Trusted_Connection=True;"
然后
add-migration
update-database
。
对我来说,这个问题不能通过添加一个空迁移来解决。我的问题是__efmigrationhistory表已被手动清除。因此,context.Database.Migrate()
方法认为它必须应用所有丢失的迁移(__efmigrationhistory中丢失的条目)。只需将所有缺失的迁移添加到db表中,它就可以再次工作了。
首先,我们必须删除我们新迁移的迁移 invoicmanagement
然后删除迁移文件夹
中的*.Designer.cs文件最后. net数据库更新-s .. invoicmanagement -s表示启动项目(webApi)请记住,此代码应在DBcontext文件中使用包含文件夹的路径。此代码在vscode中用于webapi。
我遇到了与下面相同的错误。然后我把它固定如下:(。. 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]
希望对你有帮助
我也遇到过同样的错误。
如果您在"环境变量"中保存了任何ConnectionString名称如果您的设备再次使用相同的ConnectionString名称,它会产生这种错误,请尝试使用不同的ConnectionString名称
在我的情况下,这是这种问题!!