CodeFirst предназначен для крупномасштабных приложений?


16

Я читал об Entity Framework, в частности, EF 4.1 и по этой ссылке ( http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity- framework-4.aspx ) и его руководство по Code First.

Я нахожу это опрятным, но мне было интересно, Code First должен быть просто решением для быстрой разработки, куда вы можете просто перейти без особого планирования или он действительно предназначен для использования в крупномасштабных приложениях?


Я думаю, что подход «сначала код» больше подходит для насмешек. Итак, это более дружественный к тестам.
Гюльшан

9
Code-first - это, по крайней мере, отличная технология для превращения вашего администратора в неконтролируемую пену. Таким образом, все не может быть плохо.
3Sphere

Ответы:


17

У меня могут быть некоторые хулители, но когда я читаю некоторые из этих постов от Гансельмана и Гутери, то читаю Джулии Лерман по Entity Framework, у меня действительно были трудные времена с кодом в первую очередь. За многие годы создания приложений я пошел по многим путям, как по форсированному процессу, так и по выбору, и обнаружил, что у меня гораздо больший успех при выборе ориентированного на данные представления при создании приложения.

Я говорю о линейке бизнес-приложений здесь ... это когда у вас есть бизнес-проблема или процесс, который должен иметь программное решение. У вас есть данные, которым нужно каким-то образом управлять. Лучше знать ваши данные и как они связаны с самим собой и как они используются в бизнесе. Поэтому вы моделируете эти данные, а затем создаете приложение / решение вокруг них. По моему опыту, если вы начнете создавать приложение с данными в качестве запоздалой мысли, что-то в конечном итоге будет упущено, а затем у вас будет некоторый рефакторинг (во многих случаях - рефакторинг MAJOR).

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


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

5
Даже когда вы основываете свою базу данных на CodeFirst, вы все равно используете ориентированный на данные подход. Вы просто моделируете свои данные, используя классы .Net, а не строгую базу данных. Если вы можете смоделировать свои данные в классах .net, что вам в любом случае придется сделать, чтобы знать, как использовать данные, то я не понимаю, как это является серьезным препятствием для того, чтобы позволить EF создать схему для поддержки этой модели данных.
KallDrexx

1
Я также хотел бы добавить, что если вы не используете EF 5.0+ и .NET 4.5+, если вы выберете Code First, вы наложите ограничения на производительность вашего приложения из-за невозможности генерировать объекты CompiledQuery. В настоящее время я нахожусь в процессе перемещения приложения из CodeFirst в базу данных First, потому что мы застряли в EF 4.3
Эстебан Бренес

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

5

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

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

Например, в одном из моих проектов бизнес-уровень напрямую вызывает базу данных через linq. Я использую Linq для абстрагирования своего уровня базы данных и использую CodeFirst для отображения моих POCO в схему базы данных. В этом случае CodeFirst значительно упрощает поддержание различий между соглашениями о БД (именами отношений и таблиц) и именами моих классов C #, и я могу вносить изменения в базу данных без необходимости сильно влиять на то, как мой бизнес-уровень взаимодействует с базой данных.

Однако в другом проекте я абстрагировал доступ к базе данных в неуниверсальный шаблон репозитория, и методы Get * моего репозитория отвечают исключительно за выполнение запросов к базе данных, и они возвращают реальные объекты (не IQueryable<T> s). В этом случае методы репозитория преобразуют сущности БД в сущности POCO, и в этом случае CodeFirst не дает вам таких преимуществ, как POCO CodeFirst недолговечны и быстро преобразуются в классы C # бизнес-уровня.

В конечном счете, это действительно зависит от того, как устроена команда и насколько комфортно команде (или старшим) работать с инженерами, не являющимися администраторами баз данных, которые изменяют схемы базы данных, и насколько изменения схемы повлияют на структуру вашего кода. С CodeFirst, сопоставленным с существующей базой данных, для меня тривиально переназначить свойство на новое имя столбца без необходимости глобального переименования этого имени свойства, что особенно важно, когда вы говорите об имени, которое имеет больше смысла для поля базы данных, а не свойства C #. Для меня также тривиально добавить поддержку кода для новых полей базы данных без необходимости полностью переделывать мои объекты C # (одна из причин, по которой я оставил Linq-to-sql в EF CodeFirst из существующей базы данных).


4

Code First не подходит для крупномасштабных приложений. Оборот разработки крупных приложений очень велик.

Обычно жизненный цикл вашего бизнес-приложения такой:

  1. Версия 1 находится в производстве
  2. Версия 2 находится в бета-версии
  3. Версия 3 находится в активной разработке
  4. Версия 4 находится в планировании.

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

В конце концов Code First использует ObjectContext Entity Model, более старый EF, генерирующий EDMX и использующий ObjectContext с EntityObject, был действительно достаточным для всего. Вы можете легко настроить текстовый шаблон для генерации кода. Метод обнаружения изменений медленнее с реализацией ObjectContext, но вместо генерации прокси команда EF могла бы легко улучшить скорость обнаружения изменений вместо того, чтобы сначала изобретать код.

Автоматизированная миграция

Автоматическая миграция звучит хорошо в теории, но невозможно на практике, когда вы начинаете жить. Это хорошо только для создания прототипов, разработки некоторых быстрых демонстраций.

Code First Migration совсем не подходит в такой системе. Версия 1 и версия 2, скорее всего, общаются с одной и той же базой данных. Версия 3 и версия 4 обычно являются промежуточными и имеют разные базы данных.

База данных сначала

Database First - это практичный подход, его легко сравнивать, визуализировать и поддерживать сценарии SQL. Администраторы баз данных могут работать легко.

Текстовые шаблоны

Мы создали наши собственные текстовые шаблоны для запросов и создания EDMX и ObjectContext с небольшой пользовательской реализацией, которая решает проблемы производительности. Есть несколько приложений с несколькими версиями, связывающимися с одной и той же базой данных без каких-либо проблем.

Для меня, щелкнув правой кнопкой мыши по файлу .tt и выбрав «Запустить пользовательский инструмент», это самый быстрый и простой шаг, чем написание классов, настройка и создание модели.


Миграции предназначены именно для сценария, который вы описываете.
Кейси

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

2
@Casey Это большой IF, если учесть время жизни приложения :)
BVernon

3

Обычно для крупных проектов база данных уже создана. Либо потому, что это устаревшая база данных, либо созданная компетентным dba для производительности. Единственное преимущество CodeFirst - это если вы не хотите использовать сущности EF, а вместо этого POCO.


2

Мне кажется, что «Code First» предназначен для использования EF с более «гибким» (не слишком много говорите об этом термине, я не обязательно имею в виду методологию) и приложений с нуля, где у вас нет существующая модель данных или существующие данные; приложение, которое вы также можете использовать Django, или PHP-фреймворк, или Rails для следования рекомендациям этих фреймворков, которые обычно включают создание модели данных как части кода, а не создание приложения на основе модели данных, которая является традиционной Microsoft - способ решения проблем.

Поэтому, чтобы ответить на вопрос, я бы сказал нет; если у вас уже есть данные и вы создаете приложение для их обработки, Code First не имеет особого смысла. Однако, и я совсем не использовал EF, не говоря уже о Code First EF, кажется, что это более слабосвязанный подход к коду, который всегда полезен. Предполагая, что вы можете использовать Code First, а затем по-прежнему указывать классу на существующую модель данных (вместо того, чтобы принудительно генерировать модель), подход Code First может по-прежнему помогать писать правильно абстрагированный и тестируемый код без всего обычного «бесполезного» использования. Entity Framework (т.е. сгенерированные метаклассы).


У меня есть работающее приложение с 400+, и все было создано с использованием подхода EF, основанного на коде, я смог использовать абстракцию, наследование гораздо проще, чем другие подходы к моделированию (сначала База данных, сначала модель), я советую использовать подход сначала Код, поскольку это даст вам контроль над кодом и прост в обслуживании, и вы ничего не потеряете с точки зрения производительности и времени кодирования.
Мона

1

Я бы сказал, что в действительно больших проектах код на первом месте не имеет смысла.

На самом деле, когда проект становится действительно большим, у вас часто бывает строгое разделение интересов. Не может быть одного и того же человека, пишущего код на C #, занимающегося дизайном базы данных, написанием HTML / CSS и визуальным дизайном в Photoshop. Вместо этого проектирование базы данных выполняется администратором базы данных (или, по крайней мере, отдельным человеком, который знает ее работу).

Поскольку база данных разработана человеком, знакомым с базой данных, SQL и средствами администрирования и проектирования баз данных, было бы странно видеть этого человека с помощью Entity Framework.

Более того, я не уверен, является ли Entity Framework достаточно мощным для правильного проектирования базы данных. Как насчет индексов? Ограничения? Взгляды?


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

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

1

Первый код жизнеспособен даже для больших систем: просто изучите модель после создания и переназначьте ее, используя свободный API, пока вы не достигнете нужной вам модели БД.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.