Платформа Entity Framework, добавляющая данные в базу данных
Обновлено: 21.11.2024
В этом руководстве мы рассмотрим, как добавить запись, добавить несколько записей в базу данных. Прежде чем вставлять записи в базу данных, мы должны сначала добавить сущности в контекст. Для этого мы используем методы Add и AddRange. Как только записи добавлены в контекст, мы можем вызвать метод SaveChanges, который отправляет запрос на вставку в базу данных. EF также заботится об обновлении значений идентификаторов, сгенерированных в базе данных в сущности. Мы также покажем вам, как добавлять связанные объекты или данные.
Исходный код:
Исходный код этого проекта доступен на GitHub.
Оглавление
Добавить одну запись
В приведенном ниже коде создается новый экземпляр объекта "Отдел". Затем он использует метод Add набора DbSet, чтобы добавить вновь созданный объект Department в DbContext. Обратите внимание, что метод Add добавляет новую сущность в добавленное состояние. Наконец, мы вызываем метод SaveChanges, чтобы вставить новую запись отдела в базу данных.
DepartmentID — это поле идентификации. База данных генерирует свое значение, когда мы вставляем запись в базу данных. EF извлекает только что вставленное значение DepartmentID и обновляет DepartmentID в сущности. Это обеспечит синхронизацию объекта с базой данных.
SQL-запрос вышеуказанного метода выглядит следующим образом. Обратите внимание на оператор select, который извлекает DepartmentID
Всякий раз, когда мы добавляем объект с помощью метода Add или AddRange, контекст помечает состояние объекта как добавленное. Следовательно, когда мы вызываем контекст SaveChanges, создается запрос на вставку и отправляется в базу данных.
Добавить диапазон
Вы можете добавить несколько записей или несколько объектов, используя метод AddRange DbSet, как показано в следующем коде. Код создает список объектов отдела и вставляет в список два новых отдела. Мы добавляем список в контекст, используя метод AddRange.
EF сохранит только те записи, которые вы добавите в контекст с помощью метода Add или метода AddRange.
В качестве примера рассмотрим следующий пример. Мы извлекаем все отделы в список deps. Мы создаем еще два отдела (Dept3 и Dept4) и добавляем их в список отделений. В следующей строке мы добавляем Dept5 с помощью метода Add.
Этот код только вставляет Dept5 в базу данных. Dept3 и Dept4 не добавляются, так как EF не знает о них, так как они не добавляются в контекст.
Лучшие книги по Entity Framework
Лучшие книги по Entity Framework, которые помогут вам начать работу с Entity Framework
Контекст будет отслеживать только те объекты, которые он извлекает из базы данных. Он также отслеживает те сущности, которые вы добавляете в контекст с помощью методов Add или AddRange. Следовательно, он отслеживает все объекты, находящиеся в коллекции deps, по мере их поступления из базы данных. db.Departments.ToList() . Но позже мы добавили еще два отдела напрямую в deps. Контекст не знает об этих новых записях. Следовательно, когда контекст вызывает SaveChanges , он не создает для них запрос на вставку.
Теперь рассмотрим следующий сценарий. Во-первых, мы извлекаем все отделы в список отложений. Список содержит 6 записей. Мы добавляем еще две записи, так что получается 8 записей. Теперь мы используем метод AddRange, а затем вызываем метод SaveChanges
SaveChanges вставляет 8 записей в базу данных. Хотя шесть записей уже существуют в базе данных. Add или AddRange не проверяют, существуют записи или нет. Они просто создают новую сущность, вставляют ее в контекст и получают статус Added , что приводит к запросу на вставку при вызове SaveChanges
Entity Framework всегда игнорирует значение, которое вы указываете в столбце Identity. Он не включает его в запрос на вставку.
Эти методы являются новыми для DbContext в Entity Framework Core и не имеют эквивалентов в предыдущей версии Entity Framework, где доступен DbContext (например, EF 4.1 и выше).
Чаще всего вы будете использовать универсальную версию Add, но опустите параметр типа, потому что компилятор выведет тип из аргумента, переданного методу. Следующие два примера идентичны:
Visual Studio 2015 предлагает полезный совет опустить параметр типа в первом примере. Второй пример не следует путать с версией Add, принимающей тип объекта:
При использовании любой версии Add контекст начинает отслеживать сущность, которая была передана методу, и применяет к ней значение EntityState Added. Контекст также применяет одно и то же значение EntityState Added ко всем другим объектам в графе, которые еще не отслеживаются контекстом. В следующем примере состояние «Добавлено» также применяется к книгам:
Книги добавляются на основании того факта, что на них есть ссылки через свойство Books автора. В следующем примере книги добавляться не будут:
Несмотря на то, что автор назначен свойству Author каждой из созданных книг, сущность автора не знает об этих отношениях. Его свойство Books по-прежнему имеет значение null, и книги не добавляются в контекст.
Добавление нескольких записей
Метод AddRange используется для добавления нескольких объектов в базу данных одним вызовом метода. Код в следующем примере очень похож на предыдущий, но метод AddRange используется для сохранения всех книг и автора в базу данных за один раз:
Эта версия метода AddRange принимает IEnumerable . EF Core достаточно умен, чтобы определить тип объектов, добавляемых в контекст, и сформирует соответствующий SQL. Автор связан со всеми книгами, поэтому он является частью графика и также добавляется.
Другая версия метода AddRange принимает массив params и предоставляет возможность добавить несколько несвязанных объектов в базу данных за один раз:
При вызове метода SaveChanges для DbContext все объекты с EntityState Added будут вставлены в базу данных.
В этом руководстве вы научитесь вставлять записи в базу данных с помощью Entity Framework Core. EF Core выполняет операцию вставки для сущностей, для которых EntityState установлено значение «Добавлено».
EntityState – это перечисление, в котором хранится состояние сущности. Он может иметь одно из 5 различных значений: «Добавлено», «Удалено», «Отсоединено», «Изменено» и «Без изменений». Если вы хотите добавить новый объект (запись), то его EntityState должно быть «Добавлено», если вы хотите обновить объект, он должен быть «Изменен», для удаления объекта он должен быть « Удалено" и т. д.
Это руководство является частью серии Entity Framework Core.
- 1. Введение в Entity Framework Core
- 2. Установка Entity Framework Core
- 3. База данных в первую очередь в Entity Framework Core
- 4. Класс DbContext в Entity Framework Core
- 5. Подход Code-First в Entity Framework Core
- 6. Миграции в Entity Framework Core
- 7. Вставка записей в Entity Framework Core
- 8. Чтение записей в Entity Framework Core
- 9. Обновление записей в Entity Framework Core
- 10. Удалить записи в Entity Framework Core
- 11. Соглашения в Entity Framework Core
- 12. Конфигурации в Entity Framework Core
- 13. Fluent API в Entity Framework Core
- 14. Настройка связи "один ко многим" с помощью Fluent API в Entity Framework Core
- 15. Настройка связи "один к одному" с помощью Fluent API в Entity Framework Core
- 16. Настройка отношения «многие ко многим» с помощью Fluent API в Entity Framework Core
- 17. Выполнение необработанных SQL-запросов с использованием метода FromSqlRaw() в Entity Framework Core
- 18. Выполнение хранимых процедур SQL с использованием методов FromSqlRaw() и ExecuteSqlRawAsync() в Entity Framework Core
Есть 2 сущности: отдел и сотрудник. Сущность отдела может иметь более одного сотрудника, поэтому между ними существует отношение "многие к одному".
Итак, создайте 2 класса для этих двух объектов. Создайте папку Models в корне приложения и добавьте в нее класс с именем Employee.cs. Его код приведен ниже.
Свойство навигации — это свойство, определенное для основного и/или зависимого объекта, которое ссылается на связанный объект. Обратите внимание на свойство под названием Department — public Department Department < get; задавать; >которое является свойством навигации, поскольку оно ссылается на связанный объект Department.
Затем добавьте класс Department.cs в папку Models со следующим кодом.
Обратите внимание на свойство Employee — public ICollection Employee < get; задавать; >который является свойством навигации, поскольку он ссылается на связанный объект Employee. Чтобы быть более точным, это свойство навигации коллекции, поскольку оно содержит ссылки на многие связанные объекты Employee.
Теперь добавьте файл контекста базы данных с именем CompanyContext.cs в папку Models. Его код приведен ниже:
Код — .WithMany(p => p.Employee) в строке № 45 создает отношение «многие к одному» между двумя таблицами базы данных.
Наконец запустите миграцию ядра Entity Framework, чтобы создать базу данных и таблицы из класса DbContext. Эти миграции приведены ниже:
База данных будет создана в SQL Server, и теперь мы готовы двигаться дальше.
Вставка/создание отдельной записи в базе данных
Сначала позвольте мне показать, как вставить запись в таблицу "Отдел".
Я создал новый объект Designing класса Department и установил для его EntityState значение Added.
При вызове метода DbContext.SaveChanges() эта новая запись вставляется в таблицу Department.
Есть также более короткий способ вставки записи. Приведенный ниже код сделает то же самое.
Обратите внимание, что здесь вам не нужно явно задавать для EntityState значение Added, так как EF Core делает это самостоятельно.
Метод SaveChanges(), который я использовал ранее, является синхронным методом. Вместо этого вы можете использовать метод SaveChangesAsync(), который является асинхронным методом. Асинхронные методы используют многопоточность и позволяют более эффективно использовать ресурсы сервера. Таким образом, ваши коды обрабатывают больше трафика без задержек.
Приведенный ниже код создает запись в базе данных асинхронным способом.
Вставка/создание нескольких записей в базе данных
Метод DbContext.AddRange() используется для одновременной вставки нескольких записей.
Здесь я вставляю 3 записи отдела.
То же самое можно сделать с помощью приведенного ниже кода:
Вставка связанных записей в базу данных
Таблицы Department & Employee имеют отношение "многие к одному" между собой. Здесь я вставлю по одной новой записи в каждую из этих двух таблиц (Отдел и Сотрудник).
Проверьте, я установил для свойства "Отдел" объекта "Сотрудник" объект Отдел.
Таким образом, Entity Framework Core будет знать, что сущности связаны, и вставит их обе в соответствующие таблицы.
Если вы проверите базу данных, вы найдете обе новые записи в соответствующих таблицах.
Читайте также: