【问题标题】:RazorPages relationship on Identity not returning related data身份上的 RazorPages 关系不返回相关数据
【发布时间】:2020-01-10 17:57:59
【问题描述】:

我创建了一个 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();

所以我可以创建公司并将公司链接到用户但是当我尝试使用以下代码检查当前用户是否有与之关联的公司时,它无法获取公司,x.Company 返回 Null即使有一家公司与当前用户关联

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();


        }
    }
}

【问题讨论】:

    标签: c# asp.net asp.net-identity razor-pages


    【解决方案1】:

    链接的实体不会自动返回。您需要使用此处描述的策略之一: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,则无法修改其代码,但您仍然可以加载引用的实体,如我在上面发布的链接中所述:

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

    【讨论】:

    • 这是有道理的,我已经查看了您附加的链接以及其他类似问题,但是我正在努力使用 _userManager 类来实现这一点,因为我收到以下错误@ 987654325@
    • 请提供_userManager的实现。您需要更改其 GetUserAsync 方法,但您正在尝试在结果上调用 Include()。
    • @Conor,我更新了答案。由于您无法编辑 UserManager,您需要使用替代选项来加载数据。
    猜你喜欢
    • 2016-10-26
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2019-02-01
    • 2021-10-07
    相关资源
    最近更新 更多