在ASP.Net Identity 2.0上包含属性UserManager.Users.ToListAsync和UserManager.FindByIdAsync

我正在尝试实现Asp.Net Identity 2.0。 到目前为止,我已经在这个博客的帮助下做得很好。 但是我的道路略有不同。 我希望一些数据不是User对象的一部分,而是一个新创建的Customer对象。 我希望将身份validation和授权数据与我的业务数据分开。

所以在我的例子中,我通过添加一个客户属性修改了ApplicationUser类:

public Customer Customer { get; set; } 

Customer类看起来像这样:

 public class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string Insertion { get; set; } public Gender Gender { get; set; } public DateTime Birthdate { get; set; } ...etc. public virtual ApplicationUser User { get; set; } } 

我还在ApplicationDbContext中添加了关系:

  protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasRequired(u => u.User); base.OnModelCreating(modelBuilder); } 

所以现在在对寄存器视图模型和控制器进行一些修改之后,我能够注册为用户,并且在AspNetUsers表中创建了用户记录,在Customer表中创建了Customer记录,并引用了用户记录。 到现在为止还挺好。

但是现在当我为了显示目的检索用户时,Customer属性为空。 这是有道理的,因为未加载基础记录。 通常我会使用.Include关键字来加载相关记录。 但是当我使用Asp.Net identity 2.0附带的默认UserManager时,我不知道该怎么做。

有谁知道如何实现这个目标?

我找到了答案。 在回答之前,Probablu需要更多搜索。 答案是基于这个SO问题的答案

我添加了一个名为ApplicationUserStore的类。

 public class ApplicationUserStore : UserStore { public ApplicationUserStore(DbContext context) : base(context) { } public override System.Threading.Tasks.Task FindByIdAsync(string userId) { return Users.Include(u=>u.Customer).Include(u => u.Roles).Include(u => u.Claims).Include(u => u.Logins).FirstOrDefaultAsync(u => u.Id == userId); } } 

在这个类中,我重写了FindByIdAsync以包含客户记录。

然后我在IdentityConfig.cs中更改了Create方法中的第一行,它返回ApplicationUserManager,以便它传递新创建的ApplicationUserStore而不是UserStore。

 var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get())); 

我可能还必须覆盖其他一些提取方法以包含客户记录。