EF4继承和存储过程

时间:2010-12-06 15:05:27

标签: entity-framework inheritance entity-framework-4

我用一个鉴别器字段实现了继承,所以我的所有记录都在同一个表中。我的基本类型是Person(也是表的名称),Driver和Passenger继承自它。当我对Person的对象上下文执行查询时,我收到了正确类型(Driver和Passenger)的实例。例如:

var q = from d in ctx.Person
        select d;

但是我还创建了一个调用存储过程的函数,并将函数的输出映射到Person类型。但是当我执行这个方法时,现在我得到了一个Person列表而不是Driver或Passengers。

任何人都知道如何解决这个问题,或者这是EF4中的错误?

1 个答案:

答案 0 :(得分:1)

AFAIK,在处理存储过程映射时,不能使用鉴别器映射(例如TPH)。

存储过程必须映射到复杂类型或自定义实体(例如POCO),映射不能是有条件的。

您可以做的是将其映射到常规POCO,然后项目将结果集映射到相关的派生类型(手动识别)。

E.g:

public ICollection<Person> GetPeople()
{
   var results = ExecuteFunction<Person>(); // result is ObjectResult<Person>
   ICollection<Person> people = new List<Person>(); 

   foreach (var result in results)
   {
      if (result.FieldWhichIsYourDiscriminator == discriminatorForDriver)
      {
         people.Add((Driver)result);
      }

      // other discriminators
   }

}

如果你总是希望收集一种类型(例如只有驱动程序),那么你就不需要foreach循环了,你可以只添加范围。以上是因为你期待一个不同类型的混合包。

有兴趣看看其他答案,如果有更好的方法 - 但上述方法应该有效。