c# - 访问 EF Core 中的相关表

标签 c# asp.net-core razor entity-framework-core code-behind

我正在尝试访问相关表以在我的 View 中显示一列。

我相信这是一些我不理解的非常基本的东西,但我一生都无法解决它。

简化的问题是,我有 3 个模型:分支机构、同事、职员职位。一名同事当前链接到 1 个分支机构,并且只能担任 1 个员工职位。

模型是使用 Code First 创建的
分支机构

public class Branch
    {
        [Display(Name ="Branch ID")]
        public int BranchNumber { get; set; }
        [Display(Name ="Branch Name")]
        public string BranchName { get; set; }
        [Display(Name ="Contractor Code")]
        public int ContractorCode { get; set; }
        [Display(Name ="Addresss")]
        public string AddressOne { get; set; }
       ... (Excluded for simplicity)...

        public ICollection<BranchHour> BranchHours { get; set; }
        public ICollection<Colleague> Colleagues { get; set; }

        
    }

同事

public class Colleague
    {
        [Display(Name ="ID")]
        public int ColleagueID { get; set; }

        public int BranchID { get; set; }

        
        public int StaffPositionID { get; set; }

        [Display(Name ="Payroll Number")]
        public string PayrollNumber { get; set; }
        ...(Excluded for simplicity)...
        
        public ICollection<Shift> Shifts { get; set; }
        [ForeignKey("StaffPositionID")]
        public StaffPosition StaffPosition { get; set; }
        [ForeignKey("BranchID")]
        public Branch Branch { get; set; }
    }

员工职位

public class StaffPosition
    {
        public int StaffPositionID { get; set; }
        public string PositionName { get; set; }
        public ICollection<Colleague> Colleagues { get; set; }
    }

我知道在两个类中都具有导航属性是可选的。

我的 View 模型是

public class BranchShiftData
    {
        public IEnumerable<Branch> Branches { get; set; }
        public IEnumerable<Colleague> Colleagues { get; set; }
        public IEnumerable<Shift> Shifts { get; set; }             
        public IEnumerable<StaffPosition> StaffPos { get; set; }
    }

最初我没有类次和员工职位,但我无法通过同事访问类次数据,我希望没有它。

这是“代码隐藏”页面的 OnGet 的开始

BranchData = new BranchShiftData();
            BranchData.Branches = await _context.Branches
            .Include(i => i.Colleagues)                        
            .OrderBy(i => i.BranchNumber)
            .ToListAsync();

            if (id != null)
            {
                BranchID = id.Value;
                Branch branch = BranchData.Branches
                    .Where(i => i.ContractorCode == id.Value).Single();
                BranchData.Colleagues = branch.Colleagues
                .OrderBy(i => i.FullName);
            }

            if (colleagueID != null)
            {
                ColleagueID = colleagueID.Value;                
                var selectedColleague = BranchData.Colleagues
                    .Where(x => x.ColleagueID == colleagueID).Single();
               
                FullName = selectedColleague.FullName;
                PayrollNumber = selectedColleague.PayrollNumber;
                BranchName = selectedColleague.Branch.BranchName;
                ContractHours = selectedColleague.ContractHours;
                PositionName = selectedColleague.StaffPosition.PositionName;

所以我面临的问题是我可以通过 selectedColleague 及其到分支的链接来访问分支名称,但是,这对于 StaffPosition 表不起作用,我不明白为什么。
一旦我在网络应用程序中选择了一位同事,由于以下错误,它会在以 PositionName 开头的行处中断

NullReferenceException: Object reference not set to an instance of an object.

这是正确的,因为变量堆栈将 selectedColleague 显示为 StaffPosition null。

我无法理解的是,selectedColleague 变量 BranchID 是 5558(正确),我有一个 Branch 对象,当展开时,它是 Branch 5558 的所有正确详细信息,但是,selectedColleague 的 StaffPositionID 正确为 1,但 StaffPosition 是空。

我的主要问题是为什么我可以通过以下方式获取分支名称

BranchName = selectedColleague.Branch.BranchName  

但无法通过访问访问 StaffPosition Name

PositionName = selectedColleague.StaffPosition.PositionName

决议更新后:

对于遇到此问题的任何人,Serge 下面的回答是正确的。如果您想进一步阅读 ThenInclude 函数,请查看此处
EF Core Docs
文档列表中还隐藏着来自 MS 的另一篇教程,这是针对 Razor 页面的,但也有针对 MVC 的。
MS Tutorial

最佳答案

您的分支机构中已有 Branck,但您必须添加 StaffPosition 的包含内容。试试这个

    BranchData.Branches = await _context.Branches
            .Include(i => i.Colleagues)    
            .ThenInclude(i => i.StaffPosition)                        
            .OrderBy(i => i.BranchNumber)
            .ToListAsync();

关于c# - 访问 EF Core 中的相关表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69145877/

相关文章:

asp.net - 带有内联样式表和媒体查询的 Razor View

使用 MVC 捆绑时 CSHTML 文件中的 Javascript Intellisense

javascript - .Net MVC 3 Telerik DropDownList 未触发 OnChange 事件

asp.net-core - 无法添加对 Visual Studio 2017 项目的引用

c# - 如何按需运行后台服务 - 而不是在应用程序启动或计时器上

c# - 使用 Kestrel 仅针对特定端口(在混合端口上监听)的 HTTPS 重定向

c# - 使用 ViewBag 中的列表选择 TagHelper

C# IFilter 在解决方案中安装不正确?

c# - 什么是用于比较引用类型的两个实例的 "Best Practice"?

c# - 如何在 C#/.NET 中隐藏滚动条箭头