【问题标题】:Asp.Net Core 2.1 add-migration is not picking up properties in class that inherits from IdentityUserAsp.Net Core 2.1 add-migration 没有在继承自 IdentityUser 的类中获取属性
【发布时间】:2019-02-06 01:32:18
【问题描述】:

我正在 VS2017 v15.8.2 中开发一个 ASP.Net Core 2.1.1 Web 应用程序,使用带有个人用户帐户的 Web 应用程序模板。

我想向 IdentityUser 添加更多属性,因此我创建了一个继承自 IdentityUserApplicationUser 类。我对 startup.cs 和 _loginPartial.cshtml 应用了适当的更新。一切都可以编译,但是当我运行Add-Migration 时,它不会获取我的ApplicationUser 类中的属性。我有一个迁移类,但是 up 和 down 方法没有属性。

我只有一个项目,所以在包管理器控制台中选择默认项目不是问题。

这是我的 ApplicationUser 类

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zipcode { get; set; }
    public int CompanyId { get; set; }
}

这是我的 DBContext

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

这里是Startup.cs中的服务,ConfigureService

        services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.
        GetConnectionString("AccountDbConnectionString")));

        services.AddDefaultIdentity<ApplicationUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>();

这是包管理器控制台中的添加迁移

Add-Migration -c ApplicationDbContext V1.00.01 

这是最终的迁移

public partial class V10001 : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {

    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {

    }
}

ApplicationUser 类位于项目根目录下的 Models 文件夹中。

IdentityUser 在我第一次创建项目时被解析为初始 Asp.Net Core Web 应用程序模板迁移,当我运行 update-database 命令时,它在数据库中创建了所有 AspNetUserxxx 和 AspNetRolexxx 表就好了.

但我不明白为什么 EF Migrations 没有看到 ApplicationUser 类,因此它可以将新属性添加到迁移类中。

当我在网上查找示例时,看起来我所做的一切都正确地扩展了 IdentyUser 属性。

我错过了什么?

编辑 1:我在这篇 SO 帖子中尝试了解决方案,但没有任何区别。 Entity Framework Core 2.0 add-migration not generating anything

【问题讨论】:

    标签: asp.net-identity entity-framework-core asp.net-core-2.0 asp.net-core-2.1 ef-core-2.1


    【解决方案1】:

    如下更改您的ApplicationDbContext

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    
    }
    

    这是有效的屏幕截图:

    [更新]:我只是发现@vivek nuna的答案也有效。你可以选择你喜欢的。

    [更新]:如果您遇到如下异常:

    An unhandled exception occurred while processing the request.
    

    InvalidOperationException:没有为类型“Microsoft.AspNetCore.Identity.UserManager`1[Microsoft.AspNetCore.Identity.IdentityUser]”注册的服务。 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)

    不要忘记更新_LoginPartial.cshtml,其中SignInManagerUserManager 引用IdentityUser,即,将代码更改为:

    @inject SignInManager<IdentityUser> SignInManager
    @inject UserManager<IdentityUser> UserManager
    

    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    

    【讨论】:

      【解决方案2】:

      您需要在 DBContext 中添加ApplicationUser 类。

      public class ApplicationDbContext : IdentityDbContext
      {
          public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
              : base(options)
          {
          }
      
          public virtual DbSet<ApplicationUser> ApplicationUser { get; set; }
      }
      

      然后添加迁移,然后更新数据库。

      【讨论】:

        【解决方案3】:

        由于我使用的是 ASP.NET Core 身份包,所有与登录和身份验证相关的页面,例如 _LoginPartial,必须从以下位置更改:

        @inject SignInManager<IdentityUser> SignInManager
        @inject UserManager<IdentityUser> UserManager
        

        收件人:

        @using Microsoft.AspNetCore.Identity
        inject SignInManager<ApplicationUser> SignInManager
        @inject UserManager<ApplicationUser> UserManager
        

        改变 ApplicatiuonDbContext 也很重要:

        public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
            {
                public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
                    : base(options)
                { }
        

        然后必须完成数据库迁移。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 2018-12-29
          • 2017-02-09
          • 1970-01-01
          • 2020-11-27
          • 2022-12-18
          相关资源
          最近更新 更多