Подходы EF в Asp net core

152
30 марта 2019, 08:50

Как я понимаю, есть 3 подхода в ef: Code-First,Model-First,Database-First.В чем преимущество подходов (к примеру code-first), если можно к примеру просто создать бд в asp .net core через обычные миграции(впринципе как и сделали разработчики с базовой структурой auth) ?

Answer 1

Когда вы используете базу, ее схема неизбежно должна быть описана три раза: в самой базе данных (Database), в программной мета-модели (Model) вашей библиотеки для доступа к БД и в виде структуры классов (Code). В зависимости от того, какая из этих частей создается первой - и выделяется три подхода.

Code First - это и есть подход, при котором вы "просто создаете бд через обычные миграции". При этом подходе вы как программист пишете классы сущностей, а EF за вас строит модель и создает базу.

Model First - это устаревший подход, при котором вы как программист составляете edmx-модель в визуальном дизайнере, а EF за вас генерирует вам классы и базу данных. В EF Core он уже не поддерживается, и правильно: визуальный редактор модели тормозил, лагал, глючил, и просто был неудобным. Класс, который пишется за минуту, в визуальном редакторе составляется минут пятнадцать. В 2018м году нет никаких причин использовать подход "сначала модель" в новых проектах.

Database First - это классический подход, при котором сначала мудрый DBA (администратор баз данных) составляет БД, а потом вы как программист используете ее в своей программе, автоматически сгенерировав либо вручную написав модель и классы по ней. Этот подход имеет смысл использовать если у вас уже есть готовая БД, либо если требуются серьезные оптимизации на стороне базы (хранимые процедуры, индексированные виды, триггеры).

При необходимости между подходами не так уж и сложно перейти, поэтому рекомендую начинать с Code First, а на Database First переходить когда Code First уже больше "не лезет".

Также отмечу, что подход Database First одним только EF не ограничивается, и его может оказаться целесообразнее использовать с другими инструментами: Linq2Sql, Linq2Db, Dapper

Answer 2

Code First форсируется корпорацией microsoft как наиболее рекомендуемый и прогрессивный подход. Этот подход очень хорош для быстрого старта/прототипирования приложения, хотя по мере роста вы будете всё больше упираться в его ограничения. Разработка реально много быстрее.

Из минусов:

  • не всё к сожалению можно описать кодом (а некоторые вещи ещё не успели/не стали портировать в core - приходится писать самому), некоторые вещи удобнее и проще описать на языке самой базы данных - SQL, который для этого и спроектирован.
  • EF linq to database генерирует многие запросы не самым оптимальным способом и для того, чтобы выжать по-максимуму приходится переходить на plain sql запросы. В общем-то хорошему программисту это мешает не сильно, но у начинающих часто возникает соблазн "а зачем вообще знать SQL, мы просто будем использовать Code First".

DbFirst в Core урезан до "контекст в первый раз генерируем из базы, а потом миграциями" (в EF6 был полноценный Db First).

В плюсах подхода:

  • правильная методология (база описывается отдельно от кода, а DDD'шники отдельно подчёркивают, что начинать нужно не с базы, а с моделей предметной сущности) и явно прочерченная граница архитектурных слоёв приложения.
  • возможность выжать по-максимуму скорости за счёт низкоуровневой работы с БД

В минусах:

  • подход требует больше знаний от разработчиков
  • банально медленнее в работе

Ссылки по теме:

  • «Истина в последней инстанции» или зачем нужен Database First Design
  • Database as Сode. Копаем глубже
  • Я не буду учить твой Garbage Query Language
READ ALSO
Создание хранилища объектов

Создание хранилища объектов

Товарищи, встал перед такой проблемой:

173
Обновление данных в RedBeanPHP

Обновление данных в RedBeanPHP

Ребят, как мне сделать обновление в базу данных в RedBean? При заходе на статью он видит её id и какие то поля из бд, но при нажатии на кнопку id становится...

193
Как заменить ссылку в меню плагина на Wordpress?

Как заменить ссылку в меню плагина на Wordpress?

Есть сайт на wordpress с установленным плагином idcommerce в котором есть функция вывода верхнего меню

157
Ошибка при загрузке файла

Ошибка при загрузке файла

Подскажите пожалуйста, есть такой код:

183