Entity framework core 数据库中已存在名为“AspNetRoles”的对象。正在尝试添加迁移

Entity framework core 数据库中已存在名为“AspNetRoles”的对象。正在尝试添加迁移,entity-framework-core,asp.net-core-mvc,asp.net-identity,Entity Framework Core,Asp.net Core Mvc,Asp.net Identity,我读过类似的文章,他们建议删除migrations文件夹和数据库。问题是,这是一个生产数据库。很难相信您必须删除并重新填充生产数据库才能进行更改 所以我有一个应用程序,Asp.NETMVC,目标是Core3.1,名为CompanyPortal.Web 我还有一个名为CompanyIdentity.DAL的类库 标识是在dll中设置的 我已经扩展了IdentityUser: namespace CompanyIdentity.DAL.Data { public class CompanyP

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

所以我有一个应用程序,Asp.NETMVC,目标是Core3.1,名为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; }
    }
}
当我使用命令:updatedatabase时出现错误

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

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

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

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

            services.AddIdentity<CompanyPortalUser, IdentityRole>()
                    .AddDefaultTokenProviders()
                    .AddEntityFrameworkStores<CompanyIdentityDbContext>();
我不明白的是,为什么它首先要创建表?它不应该只是尝试执行我的最后一次迁移吗

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

另一点信息。此解决方案包含两个web应用程序:CompanyPortal.web和CustomerPortal.web 它还包含两个类库,每个标识层一个:CompanyIdentity.DAL和customeriIdentity.DAL
我不确定是否应该在updatedatabase命令中指定更多的内容,因为这样做。

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

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

名为InitialDbCreation的迁移是否应用于目标数据库?EF Core Update Database不会只执行最后一次迁移,但所有当前未应用的迁移都会执行,即在_EFMigrationsHistory表中没有相应的记录。所以,要么您的初始迁移没有正确应用,要么您指向了错误的数据库。使用-Verbose调用命令,以查看EF Core工具尝试执行的操作的更多详细信息。而且绝对不要删除数据库和迁移文件夹。是的,就是这样。我开始想明白,但不确定。不要让我把评论作为答案。这是我关于堆栈溢出的第一篇文章。无需评论或将其他评论转换为答案。不管声誉如何,你无论如何都不能这样做。但你总是可以,在这种情况下,你可能应该发布自我回答。干杯。名为InitialDbCreation的迁移是否应用于目标数据库?EF Core Update Database不会只执行最后一次迁移,但所有当前未应用的迁移都会执行,即在_EFMigrationsHistory表中没有相应的记录。所以,要么您的初始迁移没有正确应用,要么您指向了错误的数据库。使用-Verbose调用命令,以查看EF Core工具尝试执行的操作的更多详细信息。而且绝对不要删除数据库和迁移文件夹。是的,就是这样。我开始想明白,但不确定。不要让我把评论作为答案。这是我关于堆栈溢出的第一篇文章。无需评论或将其他评论转换为答案。不管声誉如何,你无论如何都不能这样做。但你总是可以,在这种情况下,你可能应该发布自我回答。干杯。请始终将位于迁移文件夹中的迁移历史记录与_EFMigrationsHistory表中的行进行比较。行和文件的数量应该相同,它们的名称也应该相同。如果某些内容不合适,则表示您做错了。请始终将位于迁移文件夹中的迁移历史记录与_EFMigrationsHistory表中的行进行比较。行和文件的数量应该相同,它们的名称也应该相同。如果有些东西不合适,那就意味着你做错了。
            services.AddDbContext<CompanyIdentityDbContext>(config =>
            {
                config.UseSqlServer(_configuration.GetConnectionString("CompanyIdentityDb"));
            });

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