2010-12-06 44 views
2

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

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

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

任何人的想法如何解决这个问题或者这是EF4中的错误?

回答

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循环,你只需要添加的范围内。以上是如果您期待混合不同类型的人群。

希望看到其他答案,如果还有更好的方法 - 但上面的工作。

+0

问题是我的鉴别器字段没有公开在对象上,我想这样保留它,因为我们不想将该属性暴露给使用我们库的开发人员。所以恐怕我需要一个本地解决方案:-( – 2010-12-07 07:15:41