【问题标题】:There is already an object named 'AspNetRoles' in the database数据库中已经有一个名为“AspNetRoles”的对象
【发布时间】:2014-08-01 21:03:42
【问题描述】:

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

我尝试使用 Migrations 方法迁移数据库,但是当我在 PM 控制台中键入 Update-Database 时,它​​感到困惑并且我收到此错误 There is already an object named 'AspNetRoles' in the database.

我的问题是,使用同一个数据库对两个站点进行身份验证的最佳方式是什么(一个使用 1.0 身份版本,另一个使用 2.0)。我真的需要迁移数据库吗?

如果是,我该如何解决我遇到的这个错误?

【问题讨论】:

    标签: asp.net-mvc entity-framework identity asp.net-identity


    【解决方案1】:
    Add-Migration InitialMigrations -IgnoreChanges
    

    这应该会生成一个空白的“InitialMigration”文件。现在,将任何所需的更改添加到您想要的类。添加更改后,再次运行更新命令:

    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");
        } 
    

    【讨论】:

    • 谢谢!现在我没有收到此错误,但当我尝试登录时,我收到此““无效的列名 'Email'。\r\n无效的列名 'EmailConfirmed'。\r\n无效的列名 'PhoneNumber'。”。还有其他更改我需要在这个用户模型中做什么?我使用没有自定义属性的 IdentityUser。
    • 这里是身份1迁移到2的解决方案 [link]adamstephensen.com/2014/05/02/…
    • 我刚刚在 EF Core 中得到 A parameter cannot be found that matches parameter name 'IgnoreChanges'.
    • 此解决方案适用于 EF 6,我不知道它是否适用于 EF Core。
    • 这对我很有用,我正在使用 mvc5 和 EF6
    【解决方案2】:

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

    当您尝试连接您的第二个应用程序时,它发现没有以前的迁移,因此需要生成它的初始迁移,其中将包括身份模型的表,这些表也在其上下文中。这就是你的问题所在。

    出于Identity的目的,您需要选择一个项目来做master。这个将使用一个标准的IdentityDbContext 来迁移身份模型。

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

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

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

    【讨论】:

      【解决方案3】:

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

      "ConnectionStrings": {
          "DefaultConnection": "Server=DESKTOP-S0S1I;Database=New_name_here;Trusted_Connection=True;"
      

      然后

      add-migration 
      update-database
      

      有效。

      【讨论】:

      • 注意:这会完全创建一个新数据库。
      【解决方案4】:

      首先,我们必须删除我们新迁移的迁移 dotnet ef 迁移删除 -s ..\InvoiceManagement\

      然后删除迁移文件夹中的*.Designer.cs文件

      终于 dotnet ef 数据库更新 -s ..\InvoiceManagement\ -s 表示启动项目(webApi) 请记住,此代码应在包含文件夹路径的 DBcontext 文件中使用。 此代码用于 webapi 的 vscode。

      【讨论】:

        【解决方案5】:

        对我来说,添加空迁移无法解决问题。我的问题是 __EFMigrationsHistory 表已被手动清除。因此,context.Database.Migrate() 方法认为它必须应用所有缺失的迁移(__EFMigrationsHistory 中缺失的条目)。只需在 db 表中添加所有缺少的迁移,它应该可以再次工作。

        【讨论】:

          【解决方案6】:

          我遇到了与下面相同的错误。然后我将其修复如下:(.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]
            

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2018-10-26
            • 1970-01-01
            • 2017-01-29
            • 2020-11-26
            • 2019-05-12
            • 1970-01-01
            • 2011-03-29
            • 2016-04-08
            • 2010-11-12
            相关资源
            最近更新 更多