数据库中已存在名为 'AspNetRoles' 的对象



前段时间,我创建了一个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)

  1. 检查项目中当前数据库:

    dotnet ef migrations list
    
  2. 如果最新的是你添加的,然后删除它:

    dotnet ef migrations remove
    
  3. 保证此数据库的输出必须在源代码中详细说明:

    cs/.Designer.cs文件

  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]
    

希望对你有帮助

我也遇到过同样的错误。

如果您在"环境变量"中保存了任何ConnectionString名称如果您的设备再次使用相同的ConnectionString名称,它会产生这种错误,请尝试使用不同的ConnectionString名称

在我的情况下,这是这种问题!!

相关内容

  • 没有找到相关文章

最新更新