Однако временами из базы данных необходимо получать данные, отслеживать которые с помощью ChangeTracker
Чтобы загрузить экземпляр DbSet
ChangeTracker, добавьте к оператору LINQ вызов AsNoTracking, который указывает EF Core о необходимости извлечения данных без их помещения в ChangeTracker. Например, для загрузки записи Car без ее добавления в ChangeTracker введите следующий код:public virtual Car? FindAsNoTracking(int id)
=> Table.AsNoTracking.FirstOrDefault(x => x.Id == id);
Преимущество показанного кода в том, что он не увеличивает нагрузку на память, но с ним связан и недостаток: дополнительные вызовы для извлечения той же самой записи Car
Car:public virtual Car? FindAsNoTracking(int id)
=> Table.AsNoTrackingWithIdentityResolution.FirstOrDefault(x => x.Id == id);
Важные функциональные средства EF Core
Многие функциональные средства из EF 6 были воспроизведены в EF Core, а с каждым выпуском добавляются новые возможности. Множество средств в EF Core усовершенствовано как с точки зрения функциональности, так и в плане производительности. В дополнение к средствам, воспроизведенным из EF 6, инфраструктура EF Core располагает многочисленными новыми возможностями, которые в предыдущей версии отсутствовали. Ниже приведены наиболее важные функциональные средства инфраструктуры EF Core (в произвольном порядке).
На заметку!
Фрагменты кода в текущем разделе взяты прямо из завершенной библиотеки доступа к даннымAutoLot, которая будет построена в следующей главе.Обработка значений, генерируемых базой данных
Помимо отслеживания изменений и генерации запросов SQL из LINQ существенным преимуществом использования EF Core по сравнению с низкоуровневой инфраструктурой ADO.NET является гладкая обработка значений, генерируемых базой данных. После добавления или обновления сущности исполняющая среда EF Core запрашивает любые данные, генерируемые базой, и автоматически обновляет сущность с применением корректных значений. При работе с низкоуровневой инфраструктурой ADO.NET это пришлось бы делать самостоятельно.
Например, таблица Inventory
Identity. Столбцы Identity заполняются СУБД SQL Server уникальными числами (из последовательности) при добавлении записи и не могут обновляться во время обычных обновлений (исключая особый случай IDENTITY_INSERT). Кроме того, таблица Inventory содержит столбец TimeStamp для проверки параллелизма. Проверка параллелизма рассматривается далее, а пока достаточно знать, что столбец TimeStamp поддерживается SQL Server и обновляется при любом действии добавления или редактирования.В качестве примера возьмем добавление новой записи Car
Inventory. В приведенном ниже коде создается новый экземпляр Car, который добавляется к экземпляру DbSet класса, производного от DbContext, и вызывается метод SaveChanges для сохранения данных:var car = new Car
{
Color = "Yellow",
MakeId = 1,
PetName = "Herbie"
};
Context.Cars.Add(car);
Context.SaveChanges;
При выполнении метода SaveChanges
Id и TimeStamp из таблицы, причем свойства сущности обновляются надлежащим образом:INSERT INTO [Dbo].[Inventory] ([Color], [MakeId], [PetName])
VALUES (N'Yellow', 1, N'Herbie');
SELECT [Id], [TimeStamp]
FROM [Dbo].[Inventory]
WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity;
На заметку!
Фактически EF Core выполняет параметризованные запросы, но приводимые примеры упрощены ради читабельности.Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT