EF4 наследование и хранимые процедуры - PullRequest
2 голосов
/ 06 декабря 2010

Я реализовал наследование с полем дискриминатора, чтобы все мои записи были в одной таблице. Мой базовый тип - Person (также имя таблицы), а Driver и Passenger наследуются от него. Я получаю экземпляры правильного типа (Водитель и Пассажир), когда выполняю запрос к контексту объекта в Person. Пример:

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

Но я также создаю функцию, которая вызывает хранимую процедуру и отображает вывод функции в тип Person. Но теперь я получаю список лиц, а не водителей или пассажиров, когда я выполняю этот метод.

Кто-нибудь знает, как решить эту проблему или это ошибка в EF4?

1 Ответ

1 голос
/ 07 декабря 2010

AFAIK, вы не можете использовать отображение дискриминатора (например, TPH) при работе с отображениями хранимых процедур.

Хранимая процедура должна быть сопоставлена ​​со сложным типом или пользовательским объектом (например, POCO), отображение не можетбыть условным.

То, что вы можете сделать, это сопоставить его с обычным POCO, но затем проект , который приведет к соответствующему производному типу (ручная дискриминация).

Например:

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, вы можете просто добавить диапазон.Выше приведено на тот случай, если вы ожидаете смешанную сумку разных людей.

Было бы интересно увидеть другие ответы, и если есть лучший способ - но вышеприведенное должно сработать.

...