"There is a problem with SQl Server.", ex);

      // Возникла проблема c SQL Server

  }

  catch (DbUpdateException ex)

  {

    // Подлежит регистрации в журнале и надлежащей обработке.

    throw new CustomDbUpdateException(

        "An error occurred updating the database", ex);

      // Произошла ошибка при обновлении базы данных

  }

  catch (Exception ex)

  {

    // Подлежит регистрации в журнале и надлежащей обработке.

    throw new CustomException(

        "An error occurred updating the database", ex);

      // Произошла ошибка при обновлении базы данных

  }

}

<p id="AutBody_Root981"><strong>Обработка событий DbContext и ChangeTracker</strong></p>

Перейдите к конструктору класса ApplicationDbContext и добавьте три события DbContext, которые обсуждались в предыдущей главе:

public ApplicationDbContext(DbContextOptions options)

  : base(options)

{

  base.SavingChanges += (sender, args) =>

  {

     Console.WriteLine($"Saving changes for {((ApplicationDbContext)

       sender)!.Database!.GetConnectionString}");

  };

  base.SavedChanges += (sender, args) =>

  {

     Console.WriteLine($"Saved {args!.EntitiesSavedCount} changes for

       {((ApplicationDbContext)sender)!.Database!.GetConnectionString}");

  };

  base.SaveChangesFailed += (sender, args) =>

  {

    Console.WriteLine(

      $"An exception occurred! {args.Exception.Message} entities");

  };

}

Затем добавьте обработчики для событий StateChanged и Tracked класса ChangeTracker:

public ApplicationDbContext(DbContextOptions options)

  : 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;

  }

}

<p id="AutBody_Root982"><strong>Создание миграции и обновление базы данных</strong></p>
Перейти на страницу:

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