我用一个鉴别器字段实现了继承,所以我的所有记录都在同一个表中。我的基本类型是Person(也是表的名称),Driver和Passenger继承自它。当我对Person的对象上下文执行查询时,我收到了正确类型(Driver和Passenger)的实例。例如:
var q = from d in ctx.Person
select d;
但是我还创建了一个调用存储过程的函数,并将函数的输出映射到Person类型。但是当我执行这个方法时,现在我得到了一个Person列表而不是Driver或Passengers。
任何人都知道如何解决这个问题,或者这是EF4中的错误?
答案 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循环了,你可以只添加范围。以上是因为你期待一个不同类型的混合包。
有兴趣看看其他答案,如果有更好的方法 - 但上述方法应该有效。