Entity Framework 4, наследование или расширение?

Каковы преимущества/недостатки каждого метода?

Я знаю, что читал где-то в книге или на этом сайте, почему использование наследования таблиц не подходит для Entity Framework 4.

Например, почему бы не создать одну таблицу, в которой есть entityId, datecreated, datemodified, а затем унаследовать все остальные классы в структуре сущностей? Тогда мои таблицы для всех других объектов не должны иметь эти столбцы. Затем я могу сделать так, чтобы класс человека наследовал этот базовый класс, а затем конкретный человек наследовал человека.

Я не уверен в преимуществах этого, кроме написания меньшего SQL-скрипта для создания базы данных...

Недостатки, которые я вижу, заключаются в том, что это делает запрос/просмотр данных непосредственно в SQL большой головной болью (вся соответствующая информация разбивается на такое количество таблиц), и я также спросил своего друга, который сказал:

«Самое важное, что бросается мне в глаза, — это то, что я не хотел бы, чтобы моя база данных зависела от текущей структуры наследования моего приложения. Если бы по какой-то причине я захотел изменить дизайн своего приложения в с точки зрения наследования, это не имеет значения, потому что мои данные не будут зависеть от моего текущего дизайна системы. Я думаю о хранении данных просто как о хранилище. База данных нормализована в соответствии с правильной структурой базы данных, но наследование является программным выбор разработки приложения, а не хранения данных. Одно это помешало бы мне его использовать. Наследование - очень сложная вещь, когда дело доходит до разработки приложения. Гораздо проще изменить код приложения, чем изменить и перенести базу данных данные, когда большинство менее опытных разработчиков подходят к проблеме, они подходят к ней с помощью наследования. Я тоже так делал, когда впервые начал разрабатывать. Логически это имеет смысл. Однако после долгой разработки вы узнаете, что делегирование на самом деле лучший путь (сервисы, вызывающие сервисы в случае SOA), и что одноцелевые сервисы обеспечивают гораздо больше повторного использования, чем наследование».

Что также имеет смысл для меня.

So

1) В общем, каковы плюсы и минусы наследования по сравнению с расширением
2) В моем конкретном примере выше, что было бы более подходящим?
3) Если мой пример дерьмовый для одного или обоих, что такое хороший пример использования наследования и использования расширения?

Я использовал оба раньше, но, поскольку я далек от опыта, я все еще не знаю, как справиться со всеми ситуациями.

10 голосов, 8 избранных, более сотни просмотров и никто не может расширить? знак равно


person SventoryMang    schedule 08.11.2010    source источник


Ответы (3)


Я пробовал нечто подобное, как вы описываете, и основная проблема, которую я вижу, заключается в том, что вы не можете создать ObjectSet<T> для производного типа. Так что у вас не будет ObjectSet<Person> репозитория. Если вы получите все свои сущности, например, из сущности BusinessObject, вы сможете работать только с ObjectSet<BusinessObject>. Если вы хотите запросить только репозиторий Person, вы можете написать запрос типа Context.BusinessObjectSet.OfType<Person>().ToList(), но я думаю, что он не будет генерировать правильный SQL под капотом и сначала получит полные строки BusinessObject, а затем отфильтрует объекты Person в памяти. Так что я думаю, что это будет иметь огромное влияние на производительность.

person Alex Burtsev    schedule 27.11.2010
comment
Спасибо за ответ, BP, есть ли шанс, что вы могли бы рассказать об этом подробнее? Или других плюсов и минусов нет? Что было бы хорошим примером использования наследования? - person SventoryMang; 29.11.2010
comment
На самом деле .OfType‹Person› фильтруется на стороне SQL, IIRC - person Michiel Cornille; 19.04.2011

Я немного опоздал на вечеринку, но у меня были те же вопросы, что и у вас, относительно наследования в EF, и я нашел для вас довольно хорошее резюме. Это отрывок из книги Джули Лерман Programming Entity Framework.

После прочтения вот мои выводы по теме:

1) В целом, каковы плюсы и минусы наследования по сравнению с расширением. Плюсы действительно зависят от выбранной вами стратегии за столом. См. Как выберите стратегию наследования — блог MSDN. Однако они только «за» при условии, что вы уже решили вообще использовать наследование. И это не решение принимать легкомысленно.

Минусов много, но самым большим является невозможность добавить существующий объект в базу данных в качестве производного объекта. Например: у меня есть Student, который наследуется от Person. Существует запись человека для Джона Смита. Через некоторое время мне нужно, чтобы Джон Смит стал студентом. Ну очень плохо. Это невозможно. (По крайней мере, без обхода EF с помощью хранимой процедуры).

2) В моем конкретном примере выше, что было бы более подходящим? - В вашем примере вы должны просто добавить эти столбцы (entityId, datecreated, datemodified) в таблицы, которые в них нуждаются. Вы можете использовать сложный тип для datecreated и datemodified, но в этом нет необходимости, если вы не очень строгий парень DRY. Даже тогда это может быть излишним. Причина в том, что если у вас есть сущность, вы никогда не сможете добавить эту сущность в другую производную таблицу. Человек (который является BaseEntity) не может быть добавлен в качестве Студента позже. Кроме того, написание запросов LINQ было бы намного сложнее, чем необходимо. Алекс это уже показал.

3) Если мой пример плохой для одного или обоих, какой хороший пример для использования наследования и использования расширения? - Как правило, если вы можете сделать свой базовый тип абстрактным, наследование может работать на вас. Но вы все равно должны сначала рассмотреть другие варианты. Если ваш базовый тип будет где-то напрямую создан, просто используйте композицию. Наследование становится очень проблематичным, когда дело доходит до фактического запроса и вставки записей.

Таким образом, то, что вы можете выполнять наследование в EF, не означает, что вы должны это делать. Если вам может сойти с рук дизайн без наследования, то сделайте это во что бы то ни стало.

person Aaron    schedule 26.02.2011

Одним из недостатков использования наследования в вашей модели является то, что вы не сможете отображать свою модель через службы данных WCF (OData), поскольку в настоящее время она не поддерживает производные объекты.

person Darren Lewis    schedule 29.11.2010