在 EF Core 中访问相关的 table
Access a related table in EF Core
我正在尝试访问相关的 table 以在我的视图中显示一列。
我相信这是我不理解的非常基本的事情,但我一生无法解决它。
简化的问题是,我有 3 个模型 Branch、Colleague、Staff Position。一名同事目前 link 被分配到 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; }
}
我知道 类 中的导航属性是可选的。
我的视图模型是
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; }
}
最初我没有 Shifts 和 Staff Pos,但我无法通过 Colleague 访问 Shifts 数据,我希望没有它。
这是代码隐藏页面的 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 及其 link 到分支来访问分支名称,但是,这对 StaffPosition [=63 不起作用=] 我不明白为什么。
一旦我 select Web 应用程序中的一个同事,由于以下错误
,它在开始 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
Post分辨率更新:
对于遇到此问题的任何人,Serge 在下面的回答都是正确的。如果您想进一步阅读 ThenInclude 函数,请在此处查看
EF Core Docs
文档列表中还隐藏了另一个来自 MS 的教程,这是针对 Razor 页面的,但也有一个针对 MVC 的教程。
MS Tutorial
您已经有分支中的分支,但您必须为员工职位添加包含。试试这个
BranchData.Branches = await _context.Branches
.Include(i => i.Colleagues)
.ThenInclude(i => i.StaffPosition)
.OrderBy(i => i.BranchNumber)
.ToListAsync();
我正在尝试访问相关的 table 以在我的视图中显示一列。
我相信这是我不理解的非常基本的事情,但我一生无法解决它。
简化的问题是,我有 3 个模型 Branch、Colleague、Staff Position。一名同事目前 link 被分配到 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; }
}
我知道 类 中的导航属性是可选的。
我的视图模型是
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; }
}
最初我没有 Shifts 和 Staff Pos,但我无法通过 Colleague 访问 Shifts 数据,我希望没有它。
这是代码隐藏页面的 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 及其 link 到分支来访问分支名称,但是,这对 StaffPosition [=63 不起作用=] 我不明白为什么。
一旦我 select Web 应用程序中的一个同事,由于以下错误
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 NamePositionName = selectedColleague.StaffPosition.PositionName
Post分辨率更新:
对于遇到此问题的任何人,Serge 在下面的回答都是正确的。如果您想进一步阅读 ThenInclude 函数,请在此处查看
EF Core Docs
文档列表中还隐藏了另一个来自 MS 的教程,这是针对 Razor 页面的,但也有一个针对 MVC 的教程。
MS Tutorial
您已经有分支中的分支,但您必须为员工职位添加包含。试试这个
BranchData.Branches = await _context.Branches
.Include(i => i.Colleagues)
.ThenInclude(i => i.StaffPosition)
.OrderBy(i => i.BranchNumber)
.ToListAsync();