Entity Framework Наследование снизу вверх - PullRequest
0 голосов
/ 02 мая 2011

Я использую стандартные ObjectContext и EntityObjects в моем приложении. Скажем, две мои таблицы - это Проекты и Услуги. Проекты имеют подпроект (из таблицы «Проекты» с ParentID == ProjectID), а также сервисы. Таким образом, у меня была бы иерархия, подобная Projects-> Subprojects-> Services. Но мне нужно наследовать Projects и Services от абстрактного базового класса, чтобы я мог использовать любую из этих сущностей в качестве новой сущности Task / Job в своем приложении. Затем, например, я могу создать TreeList со списком всех задач (проекта или службы). Есть ли в EDMX конструктор, который я могу создать новый тип (сущность), который является базовым калибром для двух или более конкретных типов?

Ответы [ 3 ]

1 голос
/ 02 мая 2011

Это возможно с наследованием TPC, но это будет включать много сложностей в ваш дизайн. Например:

  • вам придется переместить общие свойства в базовый класс
  • вам, вероятно, придется поддерживать некоторые сопоставления вручную в EDMX (по крайней мере, у меня было, когда я делал пример на скриншоте)
  • у вас будет только один ObjectSet<Tasks>, и вам придется использовать OfType для запроса только проектов или услуг
  • вам придется использовать уникальный идентификатор для Task = для таблиц Project и Service (может быть достигнуто с помощью правильно настроенных идентификаторов в базе данных)

Это будет выглядеть так:

enter image description here

Другой вариант - использовать интерфейс на объектах вашей сущности вместо родительского класса. Вы можете определить интерфейс в своей частичной части объекта-сущности и самостоятельно обрабатывать получение как Проектов, так и Сервисов, когда ваш пользовательский интерфейс будет ожидать только список типов, реализующих ваш интерфейс.

0 голосов
/ 02 мая 2011

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

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

0 голосов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...