Читаем Язык программирования C#9 и платформа .NET5 полностью

В версии EF Core 5 появились три новых события, которые инициируются методами SaveChanges/SaveChangesAsync. Событие SavingChanges запускается при вызове SaveChanges, но перед выполнением операторов SQL в хранилище данных, а событие SavedChanges — после завершения работы метода SaveChanges. В следующем (простейшем) коде демонстрируются события и их обработчики в действии:


public ApplicationDbContext(DbContextOptions options)

    : 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, которые применяются для изображения представлений, оператора SQL или таблиц без первичного ключа. В предшествующих версиях EF Core для всего упомянутого использовался тип 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.HasNoKey.ToView("CustomerOrderView", "dbo");


Типы запросов могут также сопоставляться с запросом SQL, как показано ниже:


modelBuilder.Entity.HasNoKey.ToSqlQuery(

  @"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 GetOrders

{

  return CustomerOrderViewModels.FromSqlRaw(

Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT