子类型表上具有导航属性的EF表每类型

时间:2010-12-23 16:16:39

标签: c# entity-framework inheritance table-per-type

我希望SO社区的某个人能够帮助我。

简化背景: 我正在使用Entity Framework V1构建我的类结构,如下所述,我使用Table Per Type来持久保存我继承的对象:

Employee 
CaseA : Case
CaseB : Case
CaseC : Case

CaseB拥有员工导航属性

我有一个返回ObjectQuery的Repository。如果Case的类型实际上是CaseB,我需要在图中包含Employee对象。我不能.Include(“Employee”),因为它不是Case的导航属性,而Employee上没有.Load()方法。

理想情况下,我希望能够在一个查询中执行此操作,但是作为后退,我很高兴我打电话,检查对象并执行另一个调用,如下所示:(尽管如前所述,员工导航属性中不存在负载)

    //Get the case from the 
    Case myCase = new Repo<Case, Entities>.FirstOrDefault();

    if(myCase is CaseB)
       ((CaseB)myCase).Employees.load();

我在这里错过了一些非常简单的东西吗?

2 个答案:

答案 0 :(得分:3)

试试这个:

var employee = ctx.Cases
                  .OfType<CaseB>()
                  .Include("Employees")
                  .Select(x => x.Employees)
                  .FirstOrDefault();
在继承方面,

OfType<T>()是EF中最重要的方法之一 - 你应该熟悉它。

本质上是将查询中的项过滤为特定类型 - 非常类似于您在答案中执行的条件检查。

这是一个IQueryable方法(LINQ-Objects),但是在LINQ-Entities(ObjectQuery<T>)中,它被实现为INNER JOIN。

以上操作应该有效 - 只需确保在执行OfType之后执行的急切加载。

HTH。

答案 1 :(得分:0)

与往常一样,在发布问题之后,我发现thisthis指出我使用投影(下面的解决方案),但我希望避免这种情况,所以我要离开问题是否有一个更优雅的解决方案。

var Employee = caseObjectQuery.Select(x => new{
                Employee = x is CaseB ? (x as CaseB).Employee : null
            }
            ).FirstOrDefault();

只需将对象选入内存,EF就会神奇地映射相关实体。