Наследование Entity Framework снизу вверх

#entity-framework #inheritance #mapping

#entity-framework #наследование #сопоставление

Вопрос:

Я использую стандартные ObjectContext и EntityObjects в своем приложении. Допустим, две из моих таблиц — это Projects amp; Services. Проекты имеют подпроект (из таблицы Projects с родительским идентификатором == ProjectID), а также сервисы. Итак, у меня была бы иерархия типа Проекты-> Подпроекты-> Сервисы. Но мне нужно наследовать проекты и службы из абстрактного базового класса, чтобы я мог использовать любую из этих сущностей в качестве новой задачи / Job-объекта в моем приложении. Тогда, например, я могу создать древовидный список со списком всех задач (либо проекта, либо службы). Могу ли я в любом случае в EDMX designer создать новый тип (entity), который является базовым calss для двух или более конкретных типов?

Ответ №1:

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

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

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

введите описание изображения здесь

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

Комментарии:

1. Опция интерфейса, похоже, работает лучше в моей ситуации, поскольку я хочу иметь возможность напрямую запрашивать проекты и службы во многих формах. Спасибо за ваш исчерпывающий ответ.

Ответ №2:

Комментарии:

1. Я не знаю, помогает ли это мне. У меня нет моей базовой сущности в базе данных (и я не хочу ее создавать). Все, что мне нужно, это новый абстрактный базовый класс или интерфейс, чтобы сообщить проектам и службам (которые находятся в отношениях родитель-потомок), что оба типа могут рассматриваться как тип задачи. Я думаю, что с помощью POCO или нового DbContext API я могу это сделать; Я просто не был уверен, как это сделать с EntityObjects.

2. Это так, вот почему это таблица для конкретного типа, а не таблица для каждого типа.

Ответ №3:

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

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

Комментарии:

1. Это то, что мне было нужно. Я был глуп, я никогда не пробовал это с неправильным предположением, что это не сработает!! Спасибо.