Когда Microsoft впервые выпустили Entity Framework Core, я не очень сильно впечатлился. Если честно, я до сих пор не сильно люблю его для работы с базой данных в больших проектах. Просто я фанат чистого SQL, который позволяет мне получить всю гибкость, которые мы хотим.
В первых примерах я буду показывать все на примере консольного приложения, чтобы не делать никаких визуальных интерфейсов, а сконцентрироваться только на коде.
Хотя я фанат чистого SQL, возможность EF не думать о базе данных и писать только код является идеальной, когда нужно что-то быстро набросать. Я могу использовать подобные вещи для экспериментов или когда что-то нужно показать в коде. Я видел команды, где такой подход использовали в качестве основного для строительства даже достаточно большого приложения. Это возможно, если вам нравится этот подход.
Мы описали одну таблицу, но это просто класс. Тут вообще ничего не говорит о том, что этот класс каким-то образом маппится на базу данных. Чтобы .NET мог связать наш класс с базой, нужно создать класс контекста базы и добавить в него Customer.
Мы создали базу из одной таблицы и есть уже код, и чтобы завершить полный цикл, нужно посмотреть, как можно добавлять данные в базу и получать к ним доступ.
В разделе "Создаем контекст базы данных" мы уже создали начальную миграцию и использовали ее для создания нашей первой таблицы в базе данных. Сейчас настало время поговорить о миграциях чуть более подробно.
Если вы работаете над проектом, где уже есть база данных и ее нужно использовать с EF или если вы хотите иметь чуть больше контроля над тем, как выполняются миграции и не доверяете утилитам EF, то можно сначала сделать нужную вам структуру базы данных в удобных а потом сгенерировать код для этой структуры.
Мы научились создавать модели и рассмотрели простой пример, в котором в базу данных добавлялись две записи Клиентов и отображаются все содержимое. Если запустить этот пример дважды, то в базе данных появятся дубликаты, а при третьем запуске появится по три копии одних и тех же записей.
О теории связей и SQL версии этой проблемы я говорил на канале Програмысли Видеоуроки: https://www.youtube.com/watch?v=iawjAmwTo9E, а здесь мы будем говорить о проблеме только со стороны EF.
Мы знаем, как добавлять данные в одну таблицу, а сейчас посмотрим, как это делать в связанные таблицы.
Я не буду здесь повторяться и рассказывать теорию связей многие ко многим, если вы не сталкивались с подобным, то рекомендую посмотреть мое видео на канале Програмысли Видеоуроки: https://www.youtube.com/watch?v=U6w7PlU97cU
Я выстроил связи по мере популярности из личного опыта. Чаще всего я работаю с один ко многим. Чуть реже многие ко многим. Ну и самое редкое - один к одному. В последних компаниях, где я работал, у меня было два крупных случая связи один к одному. Были еще менее яркие, но вот крупных было два. При работе с Sony было две таблицы:
Если работать под Windows, то там есть очень удобная программа SQL Server Profiler, которая может подключиться к определенному серверу базы данных и начать перехватывать запросы. Под macOS я пока с такой программой не сталкивался, поэтому очень хотелось бы иметь возможность посмотреть, какие запросы выполняет EF, чтобы превратить все наши изменения в виде кода в реальные изменения в базе данных.
Имея доступ к журналам, мы смогли увидеть, что EF просто использует SQL. А давайте попробуем создать новый пример, который будет просто добавлять две новые записи в базу данных:
Очень сложно выстраивать объяснение работы с EF не прыгая по темам. Нужно объяснить, как можно добавить данные в базу, чтобы показать хотя бы простые запросы к данным и отображение. Прежде чем показать более сложные запросы, нужно поговорить о связях и как добавлять данные кучей, что уже сделано.
Мы уже не раз использовали LINQ запросы для того, чтобы обращаться к данным. В случае с EF вы можете использовать все мощности LINQ для фильтрации данных.
Мы уже достаточно хорошо рассмотрели поиск и поговорили про обновление данных и теперь пора познакомится с еще одной важной операцией – удаление.
Мы уже увидели, что изменение данных происходит достаточно просто – получаем данные из базы, изменяем свойства полученных объектов и вызываем SaveChanges() контекста базы данных. Контекст отслеживает любые изменения и автоматически генерирует запросы для изменения только измененных колонок. Например:
Мы уже неплохо окунулись в описание и создание связанных таблиц. После этого окунулись в вопрос добавления и получения данных из базы.