EF 5.0
我正在研究一个原型来一起测试hierarchyid和实体框架.我有以下架构:
Create Table dbo.Employee
(
EmployeeId int identity not null,
Name nvarchar(100) not null,
Node hierarchyid not null,
NodePath as Node.ToString() persisted,
Level AS Node.GetLevel() persisted,
ManagerNode as Node.GetAncestor(1) persisted,
ManagerNodePath as Node.GetAncestor(1).ToString() persisted
);
Alter Table dbo.Employee
Add Constraint EmployeePK Primary Key NonClustered (EmployeeId);
Go
--Enforce Hierarchy
Alter Table dbo.Employee
Add Constraint EmployeeManagerNodeNodeFK Foreign Key (ManagerNode) References Employee(Node);
Go
Create Unique Clustered Index EmployeeDepthFirstIndex on dbo.Employee(Node);
Go
Create NonClustered Index EmployeeBreathFirstIndex on dbo.Employee(Level, Node);
Go
Run Code Online (Sandbox Code Playgroud)
从我的阅读中,EF目前不支持hierarchyid数据类型,但是有些人提出了一些变通方法,例如创建我上面已经完成的计算列(Node.ToString()).
有没有办法设置EF,以便它识别父/子关系,这样我可以有效地拥有一个下属集合?例如 …
对于TestType,我想同时包含导航道具Schoolclass和Subject。
我可以这样做:
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
Run Code Online (Sandbox Code Playgroud)
但不是:
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
.ThenInclude(x => x.Schoolclass)
Run Code Online (Sandbox Code Playgroud)
因此,我尝试了一些技巧,并且奏效了:
我将TestType包含了2次...
var test = await context.Tests.Where(t => t.SchoolyearId == schoolyearId)
.Include(t => t.TestType)
.ThenInclude(x => x.Subject)
.Include(t => t.TestType)
.ThenInclude(x => x.Schoolclass)
.AsNoTracking()
.ToListAsync();
Run Code Online (Sandbox Code Playgroud)
这是官方的方法还是有更好的方法?
更新
public class TestType
{
public TestType()
{
Tests = new HashSet<Test>();
}
public int Id { get; set; }
public string Name { get; set; }
public int Weight { get; set; }
public ISet<Test> …Run Code Online (Sandbox Code Playgroud)