В версии EF Core 5 появились три новых события, которые инициируются методами SaveChanges/SaveChangesAsync
SavingChanges запускается при вызове SaveChanges, но перед выполнением операторов SQL в хранилище данных, а событие SavedChanges — после завершения работы метода SaveChanges. В следующем (простейшем) коде демонстрируются события и их обработчики в действии:public ApplicationDbContext(DbContextOptions
: base(options)
{
SavingChanges += (sender, args) =>
{
Console.WriteLine($"Saving changes for {((DbContext)sender).Database.
GetConnectionString}");
};
SavedChanges += (sender, args) =>
{
Console.WriteLine($"Saved {args.EntitiesSavedCount} entities");
};
SaveChangesFailed += (sender, args) =>
{
Console.WriteLine($"An exception occurred! {args.Exception.Message}
entities");
};
}
Класс DbSet
Для каждой сущности в своей объектной модели вы добавляете свойство типа DbSet
DbSet представляет собой специализированную коллекцию, используемую для взаимодействия с поставщиком баз данных с целью получения, добавления, обновления и удаления записей в базе данных. Каждая коллекция DbSet предлагает несколько основных служб для взаимодействия с базой данных. Любые запросы LINQ, запускаемые в отношении класса DbSet, транслируются поставщиком базы данных в запросы к базе данных. В табл. 22.2 описан ряд основных членов класса DbSet.Класс DbSet
IQueryable и обычно является целью запросов LINQ to Entity. Помимо расширяющих методов, добавленных инфраструктурой EF Core, класс DbSet поддерживает расширяющие методы, которые вы изучили в главе 13, такие как ForEach, Select и All.Вы узнаете, как добавлять к классу ApplicationDbContext
DbSet, в разделе "Сущности" далее в главе.На заметку!
Многие методы из перечисленных в табл. 22.2, имеют те же самые имена, что и методы в табл. 22.1. Основное отличие в том, что методамDbSet уже известен тип, с которым нужно работать, и список сущностей. Методы DbContext обязаны определять, на чем действовать, с применением рефлексии. Методы DbSet используются гораздо чаще, чем методы DbContext.Типы запросов
Типы запросов — это коллекции DbSet
DbQuery, но начиная с EF Core 3.1, тип DbQuery больше не употребляется. Типы запросов добавляются к производному классу DbContext с применением свойств DbSet и конфигурируются как не имеющие ключей.Например, класс CustomerOrderViewModel
AutoLot) конфигурируется с атрибутом [Keyless]:[Keyless]
public class CustomerOrderViewModel
{
...
}
Остальные действия по конфигурированию делаются в Fluent API. В следующем примере сущность устанавливается как не имеющая ключа, а тип запроса сопоставляется с представлением базы данных dbo.CustomerOrderView
HasNoKey из Fluent API не требуется, если в модели присутствует аннотация данных Keyless, и наоборот, но он показан ради полноты):modelBuilder.Entity
Типы запросов могут также сопоставляться с запросом SQL, как показано ниже:
modelBuilder.Entity
@"SELECT c.FirstName, c.LastName, i.Color, i.PetName, m.Name AS Make
FROM dbo.Orders o
INNER JOIN dbo.Customers c ON o.CustomerId = c.Id
INNER JOIN dbo.Inventory i ON o.CarId = i.Id
INNER JOIN dbo.Makes m ON m.Id = i.MakeId");
Последние механизмы, с которыми можно использовать типы запросов — это методы FromSqlRaw
FromSqlInterpolated. Вот пример того же самого запроса, но с применением FromSqlRaw:public IEnumerable
{
return CustomerOrderViewModels.FromSqlRaw(
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT