扩展 IdentityUser 不加载添加的字段

Extending IdentityUser not loading added fields

我正在使用 Asp.Net 和 Microsoft Identity。我正在扩展 IdentityUser 以添加一些额外信息。

我的 IdentityUser 覆盖:

using Microsoft.AspNetCore.Identity;

namespace DASBlazorSite.Data
{
    public class SiteUser : IdentityUser
    {
        public SiteUser() : base()
        {
        }

        public AspNetUserDetail UserData { get; set; }
    }
}

AspNetUserDetail:

using System;
using System.ComponentModel.DataAnnotations;

namespace DASBlazorSite.Data
{
    public class AspNetUserDetail
    {
        [Key]
        public Guid Id { get; set; }

        [StringLength(50)]
        public string FirstName { get; set; }

        [StringLength(50)]
        public string MiddleName { get; set; }

        [StringLength(50)]
        public string LastName { get; set; }
    }
}

完成添加迁移更新数据库之后,我看到正在创建 AspNetUserDetail table。我还在 AspNetUsers 中看到一个额外的列,UserDataId
当我修改用户并使用 UserManager.UpdateAsync(SiteUser) 保存它时,我看到 GUID 填充在 AspNetUsers 中,匹配的 GUID 填充在 AspNetUserDetail 中。我还看到 FirstName 等的相应值也填充在 AspNetUserDetail 中。
此时一切看起来都很好。但是,当我通过 UserManager 检索用户时, UserData 字段为空。
这是某种 Entity Framework lazy/eager 加载吗?关于我将如何着手纠正它有什么建议吗?
奇怪的是,如果我加载一个用户,然后将 null UserData 设置为 new AspNetUserDetail 并填写相应的值,然后执行 UserManager.UpdateAsync(SiteUser) 在 AspNetUserDetail table。它有一个新的 GUID,UserDataId 字段现在指向它。 AspNetUserDetail 中的先前条目现在处于孤立状态。

相关实体永远不会自动加载。您必须使用 Include 急切加载它们或依赖延迟加载(默认情况下未启用,一般不建议使用)。这里的问题是 UserManager 没有提供通过 Include 发出连接的工具。您可以继续并启用延迟加载,但这实际上会导致在访问 属性 时发出新查询。这可能会导致 N+1 查询问题,在执行诸如迭代之类的事情时,并且会迅速失控,从而彻底打击您的数据库。这就是为什么延迟加载是不可取的:很难确保你有效地查询数据库而且你不是很明显。

如果您处于 需要 为用户加载相关实体的情况,最好的办法是直接使用上下文,而不是 UserManager:

var user = await _context.Users.Include(x => x.AspNetUserDetail).SingleOrDefaultAsync(x => x.Id == userId);

综上所述,您正在制造 none 存在的问题。拥有可扩展用户实体的全部意义在于能够直接在该实体 上添加额外数据。首先,您不应该像这样使用 "profile" class。把名字、姓氏等属性直接放在SiteUser实体上,就什么都不用加入了。