#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. Это то, что мне было нужно. Я был глуп, я никогда не пробовал это с неправильным предположением, что это не сработает!! Спасибо.