Identity 上的 RazorPages 关系不返回相关数据

RazorPages relationship on Identity not returning related data

我创建了一个 Razor Pages 项目并创建了一个名为 company 的数据模型并修改了用户身份以与公司建立关系。

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string Surname { get; set; }
    public Company Company { get; set; }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string AccessCode { get; set; }
    public ICollection<ApplicationUser> Employees { get; set; }
}

使用下面的代码我可以创建一个公司并将该公司分配给用户

Company c = new Company { Name = Input.Name };
_context.Companies.Add(c);            
await _context.SaveChangesAsync();

ApplicationUser u = await _userManager.GetUserAsync(User);
u.Company = c;
await _context.SaveChangesAsync();

所以我可以创建一个公司并 link 该公司给用户但是当我尝试使用下面的代码检查当前用户是否有与之关联的公司时它无法获得公司, x.Company returns 为空,即使有公司 linked 给当前用户

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Fleet_Man.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace Fleet_Man.Pages
{
    public class CompanyModel : PageModel
    {
        private readonly UserManager<ApplicationUser> _userManager;
        ApplicationDbContext _context;

        public CompanyModel(UserManager<ApplicationUser> userManager, ApplicationDbContext appDbContext)
        {
            _userManager = userManager;
            _context = appDbContext;
        }
        public Boolean CompanyMember { get; set; }
        [BindProperty]
        public InputModel Input { get; set; }

        public string ReturnUrl { get; set; }

        public string Message { get; set; }


        public class InputModel
        {
            [Required]
            [Display(Name = "Company Name")]
            public string Name { get; set; }
        }


        public async Task<IActionResult> OnGetAsync(string returnUrl = null)
        {
            //ApplicationUser x = await _userManager.GetUserAsync(User);
            //Updated to reflect suggestion below
            ApplicationUser x = await _userManager.GetUserAsync(User).Inlcude(u => u.Company).FirstOrDefaultAsync(u => u.FirstName == User);
            ReturnUrl = returnUrl;

            if (x.Company == null)
            {
                CompanyMember = false;
                Message = "You don't belong to a company.";
            }
            else
            {
                CompanyMember = true;
                Message = "You belong to a company.";
            }

            return Page();
        }
        public async Task<IActionResult> OnPostAsync(string returnUrl = null)
        {
            if (ModelState.IsValid)
            {
                ReturnUrl = returnUrl;
                Company c = new Company { Name = Input.Name };
                _context.Companies.Add(c);


                await _context.SaveChangesAsync();
                ApplicationUser u = await _userManager.GetUserAsync(User);
                u.Company = c;
                await _context.SaveChangesAsync();
                //var p = new Patient { Title = Input.Title, FirstName = Input.FirstName, Surname = Input.Surname, DOB = Input.DOB, NHSNumber = Input.NHSNumber };
                //_context.Patients.Add(p);
                //await _context.SaveChangesAsync();
                //Message = "Patient (" + Input.FirstName + " " + Input.Surname + ") created successfully";

                //return RedirectToPage("AllPatients");
            }
            return Page();


        }
    }
}

链接的实体不会自动返回。您需要使用此处描述的策略之一:Loading Related Data

我没有 _userManager 的实现细节,但我认为您需要像这样更改它

public async ApplicationUser GetUserAsync(string User) =>
  await _context.Users
                .Inlcude(u => u.Company) // explicitly load Company
                .FirstOrDefaultAsync(u => u.FirstName == User)

如果您使用 .net core UserManager,那么您将无法修改其代码,但您仍然可以按照我上面发布的 link 中的描述加载引用的实体:

var x = await _userManager.GetUserAsync(User)
_context.Entry(x)
        .Reference(b => b.Company)
        .Load();