数据库中已经有一个名为"AspNetRoles"的对象

gog*_*gog 19 asp.net-mvc identity entity-framework asp.net-identity

前段时间,我使用Identity 1.0版本创建了一个ASP.NET MVC 5网站,并使用此项目创建了Identity表.现在我必须让其他网站使用相同的数据库进行身份验证,但现在身份版本是2.0.因此,当我尝试在新网站中进行身份验证时,我会遇到一些错误.

我试图使用迁移方法迁移数据库,但是There is already an object named 'AspNetRoles' in the database. 当我在PM控制台中键入Update-Database时,它很困惑并且我得到了这个错误.

我的问题是,如何使用相同的数据库来验证两个站点(一个使用1.0身份版本,另一个使用2.0).我真的需要迁移数据库吗?

如果是的话,我怎样才能解决这个错误?

Moh*_*our 38

Add-Migration InitialMigrations -IgnoreChanges
Run Code Online (Sandbox Code Playgroud)

这应该生成一个空白的"InitialMigration"文件.现在,将所需的更改添加到所需的类中.添加更改后,再次运行update命令:

update-database -verbose
Run Code Online (Sandbox Code Playgroud)

现在将应用自动迁移,并且表格将随您的更改而更改.

编辑: 以下是将身份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");
    } 
Run Code Online (Sandbox Code Playgroud)

  • 我只是在 EF Core 中得到“找不到与参数名称“IgnoreChanges”匹配的参数。 (4认同)

Chr*_*att 12

虽然您可以(自EF6起)在同一数据库的两个单独项目中使用迁移,但不能有任何重叠.迁移的工作方式是通过一个dbo._MigrationHistory表来存储生成迁移的上下文和应用程序的模型状态,其中包括Identity模型.

当您尝试连接第二个应用程序时,它找不到先前的迁移,因此需要生成它的初始迁移,其中将包括Identity模型的表,这些表也在其上下文中.这就是你的问题所在.

出于Identity的目的,您需要选择一个项目来制作master.这个将使用标准IdentityDbContext模型将迁移的标准.

另一个项目需要成为奴隶,至少在利用身份方面.因此,您需要在此应用程序中与至少两个上下文进行交互.一个将是子类IdentityDbContext,但被视为数据库优先:

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

另一个上下文将只是一个DbContext将正常迁移的常规子类.您需要为可能需要从同一数据库访问相同身份信息的任何其他项目重复此操作.此外,由于重复的代码将导致(以及您的ApplicationUser类需要共享的事实),您应该将此代码移动到每个项目可以引用的类库中.


小智 7

在“appsettings.json”文件中更改数据库名称

"ConnectionStrings": {
    "DefaultConnection": "Server=DESKTOP-S0S1I;Database=New_name_here;Trusted_Connection=True;"
Run Code Online (Sandbox Code Playgroud)

进而

add-migration 
update-database
Run Code Online (Sandbox Code Playgroud)

有用。

  • 注意:这会完全创建一个新数据库。 (3认同)