Asp.Net Core 2.1 add-migration不选择继承自IdentityUser的类中的属性

时间:2018-08-31 04:07:56

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

我正在使用VS2017 v15.8.2中的ASP.Net Core 2.1.1 Web应用程序,并将Web应用程序模板与单个用户帐户一起使用。

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

我只有一个项目,因此在Package Manager控制台中选择默认项目不是问题。

这是我的ApplicationUser类

ApplicationUser

这是我的DBContext

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

这是Startup.cs中的服务,ConfigureService

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

这是Package Manager控制台中的添加迁移

        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) { } } 类位于项目根目录下的Models文件夹中。

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

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

当我在网上查找示例时,似乎我在正确地进行所有操作以扩展ApplicationUser属性。

我想念什么?

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

3 个答案:

答案 0 :(得分:1)

您需要在DBContext中添加ApplicationUser类。

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

    public virtual DbSet<ApplicationUser> ApplicationUser { get; set; }
}

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

答案 1 :(得分:1)

如下更改您的ApplicationDbContext

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

}

这是有效的屏幕截图:

enter image description here

[更新] :我只是发现@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提供者,类型serviceType)

不要忘记更新_LoginPartial.cshtmlSignInManager引用UserManager的{​​{1}},即从以下位置更改代码:

IdentityUser

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

答案 2 :(得分:0)

当我使用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)
        { }

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