我有两个表,一个是自引用这样的:有没有办法自定义实体查询的默认行为?
Job (id, description)
JobAssembly (id, jobid, parentassemblyid)
我也以同样的方式有两个域对象:
public class Job
{
public int Id { get; set; }
public string Description { get; set; }
public virtual List<JobAssembly> Assemblies { get; set; }
}
public class JobAssembly
{
public int Id { get; set; }
public int JobId { get; set; }
public virtual Job { get; set; }
public int? ParentAssemblyId { get; set; }
public virtual JobAssembly ParentAssembly { get; set; }
public virtual List<JobAssembly> SubAssemblies { get; set; }
}
这是问题所在。当我使用EF时:
using (var db = new JobContext())
{
var job = db.Jobs.Find(1);
}
我按预期得到所要求的工作。但它带有所有的装配 - 不仅仅是父母,还有子装配。这也是预料之中的。
我的问题是:我如何指示EF只带入没有子装配的JobAssemblies ...作为默认行为?我知道如何查询EF的父级程序集。但有没有办法设置映射,或者其他方式,将默认查询行为设置为仅获取其parentassemblyid == null的程序集?
谢谢:)
编辑:
让我来说明一下:
我有ID的工作= 1,它有一个装配有ID = 1组件1有两个子组件分别是ids = 2和3。当执行var job = db.Jobs.Find(1)时,EF像这样填充对象图:
作业具有全部三个程序集(因为jobid在所有三个== 1上)。具有ID 1的JobAssembly使其子部件适当地填充。
所有这些都是预期的,但如果我可以定制EF如何加载对象,那将会很好。作业不应该具有JobId == 1的每个JobAssembly,但只有JobId == 1和ParentAssemblyId == null的地方。
你能显示代码?没有'虚拟'关键字,因此不会延迟加载。所以你必须急于加载它,否则你不会得到任何程序集所有的程序集 – Colin
我的错。让我显示虚拟关键字。我将编辑。 –
你想引入“只是父母” - 即树的根。或者你想引入“JobAssemblies没有子装配” - 即叶子? – Colin