首页 > 解决方案 > 数据库中已经有一个名为“AspNetRoles”的对象。尝试添加迁移

问题描述

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

所以我有一个应用程序,面向 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 不确定我是否应该在更新数据库中指定更多内容因为那个命令。

标签: entity-framework-coreasp.net-core-mvcasp.net-identity

解决方案


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


推荐阅读