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

Mou*_*him 2 c# asp.net asp.net-mvc entity-framework asp.net-identity-2

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

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

    public Customer Customer { get; set; }
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)

我还在ApplicationDbContext中添加了关系:

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

    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mou*_*him 6

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

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

public class ApplicationUserStore : UserStore<ApplicationUser>
{
    public ApplicationUserStore(DbContext context)
        : base(context)
    {
    }

    public override System.Threading.Tasks.Task<ApplicationUser> 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

var manager = new ApplicationUserManager(new ApplicationUserStore(context.Get<ApplicationDbContext>()));
Run Code Online (Sandbox Code Playgroud)

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