Подтвердить что ты не робот

Entity Framework 4, наследующий vs, расширяющий?

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

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

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

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

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

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

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

So

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

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

10 голосов, 8 фаворитов, более сотни просмотров и никто не может расшириться? = (.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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