通常,没有身份,ApplicationDbContext 继承自 DbContext。
我有一个包含四个项目的解决方案。 WEB、WebAPI、DATA 和 ENTITIES。
我有一个位于DATA 的ApplicationDbContext,并已将其修改为从IdentityDbContext 继承,例如:
public class ApplicationDbContext : IdentityDbContext<IdentityUser>
现在,ENTITIES 是定义模型 (POCO) 的位置。
并且,DATA 中的 AppliationDbContext 包含对这些类的引用,并包含 EF 使用的 DbSet<T> 属性设置器。 ENTITIES 中的 Person(aka, ApplicationUser) 类如下所示:
public class Person : IdentityUser
{
[PersonalData]
public string LastName { get; set; }
在WEB 项目中,通过对DATA 和ApplicationDContext 的适当引用,我只有一个services.AddDbContext<T> 依赖引用;然后在AddDefaultIdentity<IdentityUser>() 服务添加中使用该上下文。:
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
似乎只使用一个DbContext 服务就可以解决问题。它还扩展了AspNetUsers 表以包含我在位于ENTITIES 内的POCO Person 模型类中设置的[PersonalData] 属性。
现在,因为
<IdentityUser> 已扩展,在我的例子中是 Person,所有对 IdentityUser 的引用都应该更新以反映这一点。所以Startup.ConfigureServices 现在看起来像这样:
services.AddDefaultIdentity<Person>()
.AddEntityFrameworkStores<ApplicationDbContext>();
并且,在 UI 中,要访问由“Person”添加的属性,~/Identity/Account/Manage/Index.cshtml.cs 中的引用也需要更新:
private readonly UserManager<Person> _userManager;
private readonly SignInManager<Person> _signInManager;
private readonly IEmailSender _emailSender;
public IndexModel(
UserManager<Person> userManager,
SignInManager<Person> signInManager,
IEmailSender emailSender)
{
_userManager = userManager;
_signInManager = signInManager;
_emailSender = emailSender;
}
您必须更新index.cshtml.cs 中的'InputModel' 以及OnGetAsync() 方法中的'new up' 以映射属性——类似于默认设置处理Email 的方式。
最后,index.cshtml 视图文件可以访问 UI/剃须刀显示。
这应该可以帮助您解决问题中的第 1 至 4 项。