通过 ApplicationUser class 引用额外的 UserSettings class

Reference an additional UserSettings class through the ApplicationUser class

我正在尝试添加对其他 table 的引用,然后从数据库加载信息。我想添加 UserSettings,因为用户可以有多个可以配置的设置。

我认为我已正确设置所有内容,但不知何故未加载来自外键 table 的信息。我尝试了之前问题的各种帖子,但我无法解决问题。

代码在UserSetting.cs

public class UserSetting
{                                                     
    public string ID { get; set; }
    public string SettingType { get; set; }
    public string Description { get; set; }
    public string SettingValue { get; set; }
    public virtual ApplicationUser ApplicationUser { get; set; }
}

代码在ApplicationUser.cs

public class ApplicationUser : IdentityUser
{ 
    public virtual List<UserSetting> UserSettings { get; set; }
}

代码在AppDbContext.cs

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

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {                    
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<ApplicationUser>(b =>          
        {                                        
              b.HasMany(e => e.UserSettings) 
                    .WithOne()             
                    .HasForeignKey(uc => uc.ID) 
                    .IsRequired();                       
        });                                                
     }
}

代码在HomeController.cs

public class HomeController : Controller
{
    private readonly UserManager<ApplicationUser> userManager;
    public HomeController(UserManager<ApplicationUser> userManager
    {
         this.userManager = userManager;
    }

    public async Task<IActionResult> LoadProfile()     
    {
         var user = await userManager.FindByNameAsync("username");
    }
}

在哪里以及如何将 UserSettings 加载到 ApplicationUser class 以便我可以引用它?

您可以使用Include()查询相关数据,如下所示:

public async Task<IActionResult> LoadProfile()
{
        var user = await userManager.Users
                 .Include(u=>u.UserSettings)
                 .SingleAsync(u=>u.UserName=="sherry@email.com");
}

如果要使用FindByEmailAsync()获取相关数据,可以参考创建自己的IUserStore,在FindByEmailAsync方法中加载相关数据。