【问题标题】:There is already an object named 'AspNetRoles' in the database. Trying to add migration数据库中已经有一个名为“AspNetRoles”的对象。尝试添加迁移
【发布时间】:2020-11-26 06:41:20
【问题描述】:

我读过类似的帖子,他们建议删除迁移文件夹并删除数据库。问题是,这是一个生产数据库。很难相信您必须删除并重新填充生产数据库才能进行更改。

所以我有一个应用程序,面向 Core 3.1 的 Asp.Net MVC,名为 CompanyPortal.Web 我还有一个名为 CompanyIdentity.DAL 的类库

身份在 dll 中设置。

我已经扩展了 IdentityUser:

namespace CompanyIdentity.DAL.Data
{
    public class CompanyPortalUser: IdentityUser
    {
        public string CoreUserId { get; set; }
    }
}

目前只有一个迁移,最初的一个:20200711193329_InitialDbCreation.cs

我正在尝试更改 CoreUserId 的数据类型并添加几个字段:

namespace CompanyIdentity.DAL.Data
{
    public class CompanyPortalUser: IdentityUser
    {
        public int CoreUserId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
}

使用命令时出现错误:Update-Database

我相信这是与此相关的所有代码:

namespace CompanyIdentity.DAL.Data
{
    public class CompanyIdentityDbContext: IdentityDbContext<CompanyPortalUser>
    {
        public CompanyIdentityDbContext(DbContextOptions<CompanyIdentityDbContext> options): base(options)
        {

        }
    }
}
namespace CompanyIdentity.DAL.Migrations
{
    public partial class AddedToCompanyPortalUser : Migration
    {
        protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.AlterColumn<int>(
                name: "CoreUserId",
                table: "AspNetUsers",
                nullable: false,
                oldClrType: typeof(string),
                oldType: "nvarchar(max)",
                oldNullable: true);

            migrationBuilder.AddColumn<string>(
                name: "FirstName",
                table: "AspNetUsers",
                nullable: true);

            migrationBuilder.AddColumn<string>(
                name: "LastName",
                table: "AspNetUsers",
                nullable: true);
        }

        protected override void Down(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.DropColumn(
                name: "FirstName",
                table: "AspNetUsers");

            migrationBuilder.DropColumn(
                name: "LastName",
                table: "AspNetUsers");

            migrationBuilder.AlterColumn<string>(
                name: "CoreUserId",
                table: "AspNetUsers",
                type: "nvarchar(max)",
                nullable: true,
                oldClrType: typeof(int));
        }
    }
}

以下是 Starup.cs ConfigureServices() 中的相关位:

            services.AddDbContext<CompanyIdentityDbContext>(config =>
            {
                config.UseSqlServer(_configuration.GetConnectionString("CompanyIdentityDb"));
            });

            services.AddIdentity<CompanyPortalUser, IdentityRole>()
                    .AddDefaultTokenProviders()
                    .AddEntityFrameworkStores<CompanyIdentityDbContext>();

我不明白的是为什么它首先尝试创建表?它不应该只是尝试执行我的最后一次迁移吗?

我将 CompanyPortal.Web 设置为启动项目。 我还将包管理器控制台中的默认项目设置为:CompanyIdentity.DAL

另一个信息。此解决方案包含两个 Web 应用程序:CompanyPortal.Web 和 CustomerPortal.Web 它还包含两个类库,一个用于每个身份层:CompanyIdentity.DAL 和 CustomerIdentity.DAL 因此,我不确定我是否应该在 Update-Database 命令中指定更多内容。

【问题讨论】:

  • 被称为InitialDbCreation的迁移应用到目标数据库了吗? EF Core Update-Database 不会只执行“最后一次”迁移,而是当前未应用 all 迁移,即__EFMigrationsHistory 表中没有相应的记录。因此,要么您的初始迁移未正确应用,要么您指向错误的数据库。使用-Verbose 调用命令以查看有关 EF Core 工具尝试执行的操作的更多详细信息。并且绝对不要删除数据库和迁移文件夹。
  • 是的,就是这样。我开始弄清楚这一点,但不确定。不允许我将评论标记为答案。这是我在 Stack Overflow 上的第一篇文章。
  • 无需评论或将其他 cmets 变成答案(无论“声誉”如何,您都不能这样做)。但是您总是可以(在这种情况下可能应该)发布自我答案。干杯。

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


【解决方案1】:

事实证明,整个解决方案在某个时候被完全重写,并且保留了旧数据库。 __EFMigrationsHistory 表中的记录 MigrationId 与项目的 Migrations 文件夹中的文件名不匹配。由于有一条记录,最初的迁移记录,我删除了该记录,然后插入了一条正确的MigrationIdProductVersion的记录。

【讨论】:

  • 始终将您的迁移历史记录(位于迁移文件夹内)与 __EFMigrationsHistory 表的行进行比较。行数和文件数应相同,名称也应相同。如果有什么不合适,那就意味着你做错了什么。
猜你喜欢
  • 2014-08-01
  • 2018-10-26
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 2016-11-03
  • 2013-11-26
  • 2020-07-03
  • 2019-05-12
相关资源
最近更新 更多