$"An exception occurred! {args.Exception.Message} entities");
};
}
Затем добавьте обработчики для событий StateChanged
и Tracked
класса ChangeTracker
:
public ApplicationDbContext(DbContextOptions
: base(options)
{
...
ChangeTracker.Tracked += ChangeTracker_Tracked;
ChangeTracker.StateChanged += ChangeTracker_StateChanged;
}
Аргументы события Tracked
содержат ссылку на сущность, которая инициировала событие, и указывают, было оно получено из запроса (загруженного из базы данных) или добавлено программно. Добавьте в класс ApplicationDbContext
следующий обработчик событий:
private void ChangeTracker_Tracked(object? sender, EntityTrackedEventArgs e)
{
var source = (e.FromQuery) ? "Database" : "Code";
if (e.Entry.Entity is Car c)
{
Console.WriteLine($"Car entry {c.PetName} was added from {source}");
}
}
Событие StateChanged
инициируется при изменении состояния сущности. Одно из применений этого события — аудит. Поместите в класс ApplicationDbContext
приведенный ниже обработчик событий. Если свойство NewState
сущности имеет значение Unchanged
, тогда выполняется проверка свойства OldState
для выяснения, сущность была добавлена или же модифицирована.
private void ChangeTracker_StateChanged(object? sender,
EntityStateChangedEventArgs e)
{
if (e.Entry.Entity is not Car c)
{
return;
}
var action = string.Empty;
Console.WriteLine(
$"Car {c.PetName}
was {e.OldState} before the state changed to
{e.NewState}");
switch (e.NewState)
{
case EntityState.Unchanged:
action = e.OldState switch
{
EntityState.Added => "Added",
EntityState.Modified => "Edited",
_ => action
};
Console.WriteLine($"The object was {action}");
break;
}
}
Создание миграции и обновление базы данных
На этой стадии оба проекта компилируются и все готово к созданию еще одной миграции для обновления базы данных. Введите в каталоге проекта AutoLot.Dal
следующие команды (каждая команда должна вводиться в одной строке):
dotnet ef migrations add UpdatedEntities -o EfStructures\Migrations
-c AutoLot.Dal.
EfStructures.ApplicationDbContext
dotnet ef database update UpdatedEntities
-c AutoLot.Dal.EfStructures.ApplicationDbContext
Добавление представления базы данных и хранимой процедуры
Осталось внести в базу данных два изменения: создать хранимую процедуру GetPetName
, рассмотренную в главе 21, и добавить представление базы данных, которое объединяет таблицу Orders
с деталями Customer
, Car
и Make
.
Добавление класса MigrationHelpers
Хранимая процедура и представление будут создаваться с использованием миграции, которая требует написания кода вручную. Причина поступать так (вместо того, чтобы просто открыть Azure Data Studio и запустить код T-SQL) — желание поместить полное конфигурирование базы данных в один процесс. Когда все содержится в миграциях, единственный вызов dotnet ef database update
гарантирует, что база данных является актуальной, включая конфигурацию EF Core и специальный код SQL.
Выполнение команды the dotnet ef migrations add
при отсутствии изменений в модели все равно приводит к созданию файлов миграции, имеющих правильную отметку времени, с пустыми методами Up()
и Down()
. Введите показанную ниже команду для создания пустой миграции (но не применения миграции):
dotnet ef migrations add SQL -o EfStructures\Migrations
-c AutoLot.Dal.EfStructures.
ApplicationDbContext