Как внедрить полиморфизм в модель данных сущностей - PullRequest
2 голосов
/ 17 мая 2011

Я работаю с моделью базы данных, которая имеет следующие таблицы:

  • Мотоциклы,
  • Автомобили,
  • Самолеты

Когда я генерирую файл ADO.NET Entity Data Model edmx, я получаю отдельный класс C # для каждой таблицы.Все вышеперечисленные классы имеют одинаковые свойства (например, MaxSpeed).Я хотел бы ввести полиморфизм, создав базовый класс Vehicle и перенести общие свойства и методы в этот базовый класс.

Я не могу изменить базу данных, поскольку она не поддерживает наследование.Есть ли способ добиться этого?

Я использую .NET 4.0 и SQL Server 2008.

Ответы [ 4 ]

2 голосов
/ 17 мая 2011

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

Покаяние предоставило этот пример в действии, что кажется действительно хорошим.В общем, одна проблема с таблицей для каждого конкретного типа состоит в том, что каждый из ваших конкретных типов - автомобиль, самолет, мотоцикл - должен иметь уникальные ключи.Другими словами, если есть автомобиль с id = 5, то не может быть мотоцикла или самолета с таким идентификатором.Таким образом, с тремя таблицами вам, вероятно, придется либо использовать направляющие, либо, как указал Ладислав, соответствующим образом установить исходные значения и значения приращения в столбцах идентификации (seed = 1, 2 и 3, increment = 3)

В идеале вы хотели бы (изменить базу данных и) добавить новую таблицу с вашими общими свойствами, и пусть она будет служить вашим базовым классом, с наследованием транспортного средства, автомобиля и т. Д.EF поддерживает этот метод, называемый таблицей в иерархии, гораздо проще.

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

Возможно, вам лучше использовать интерфейсы для предоставления доступа вашим сущностям.Код сущности генерируется автоматически, поэтому вам не нужно слишком много повторяться, и вы можете написать методы, которые будут использовать интерфейс для общей обработки классов.

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

Самое близкое, что вы можете получить, - это использовать подход «Таблица на сущность».

Но тогда потребуется таблица «Автомобиль», в которой хранятся идентификаторы и общие свойства.Это вызывает вопрос: как хранятся ваши идентификаторы?У каждой таблицы есть свой идентификатор?Тогда я думаю, что нельзя использовать сущность hiearchy.Если вы можете изменить это, то станет возможным использование Таблицы для каждой сущности.

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

Если вы делаете это по-своему, то вы будете путать POCO с объектами домена, если только вы не примените дизайн, основанный на модели, основанной на коде, в EF 4.1.

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