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

Когда метод Remove() вызывается на отслеживаемой сущности, свойство EntityState устанавливается в Deleted. После успешного выполнения оператора удаления сущность исключается из ChangeTracker и состояние изменяется на Detached. Обратите внимание, что сущность по-прежнему существует в вашем приложении, если только она не покинула область видимости и не была подвержена сборке мусора.

<p id="AutBody_Root1060"><strong>Удаление отслеживаемых сущностей</strong></p>

Процесс удаления зеркально отображает процесс обновления. Как только сущность начала отслеживаться, вызовите Remove() на контексте и затем вызовите SaveChanges(), чтобы удалить запись из базы данных:

[Fact]

public void ShouldRemoveACar()

{

  ExecuteInATransaction(RunTheTest);

  void RunTheTest()

  {

    var carCount = Context.Cars. Count();

    var car = Context.Cars.First(c => c.Id == 2);

    Context.Cars.Remove(car);

    Context.SaveChanges();

    var newCarCount = Context.Cars.Count();

    Assert.Equal(carCount - 1, newCarCount);

    Assert.Equal(

      EntityState.Detached,

      Context.Entry(car).State);

  }

}

После вызова SaveChanges() экземпляр сущности все еще существует, но больше не находится в ChangeTracker. Состоянием EntityState будет Detached. Вот как выглядит выполняемый код SQL:

exec sp_executesql N'SET NOCOUNT ON;

DELETE FROM [dbo].[Inventory]

WHERE [Id] = @p0 AND [TimeStamp] = @p1;

SELECT @@ROWCOUNT;'

,N'@p0 int,@p1 varbinary(8)',@p0=2,

@p1=0x0000000000008680

<p id="AutBody_Root1061"><strong>Удаление неотслеживаемых сущностей</strong></p>

Неотслеживаемые сущности способны удалять записи таким же способом, каким они могут обновлять записи. Удаление производится вызовом Remove()/RemoveRange() или установкой состояния в Deleted и последующим вызовом SaveChanges().

В показанном ниже тесте сначала читается запись как неотслеживаемая и на основе записи создается новый экземпляр класса Car. Затем либо устанавливается состояние в Deleted, либо применяется метод Remove() класса DbSet (в зависимости от того, какая строка кода закомментирована) и вызывается SaveChanges(). Все дополнительные контексты нужны для обеспечения точности теста и отсутствия пересечения между контекстами:

[Fact]

public void ShouldRemoveACarUsingState()

{

  ExecuteInASharedTransaction(RunTheTest);

  void RunTheTest(IDbContextTransaction trans)

  {

    var carCount = Context.Cars.Count();

    var car = Context.Cars.AsNoTracking().First(c => c.Id == 2);

    var context2 = TestHelpers.GetSecondContext(Context, trans);

    // Либо модифицировать состояние, либо вызвать Remove().

    context2.Entry(car).State = EntityState.Deleted;

    // context2.Cars.Remove(car);

    context2.SaveChanges();

    var newCarCount = Context.Cars.Count();

    Assert.Equal(carCount - 1, newCarCount);

    Assert.Equal(

      EntityState.Detached,

      Context.Entry(car).State);

  }

}

<p id="AutBody_Root1062"><strong>Перехват отказов каскадного удаления</strong></p>

Когда попытка удаления записи терпит неудачу из-за правил каскадирования, то исполняющая среда EFCore генерирует исключение DbUpdateException. Следующий тест демонстрирует это в действии:

[Fact]

public void ShouldFailToRemoveACar()

{

  ExecuteInATransaction(RunTheTest);

   void RunTheTest()

  {

    var car = Context.Cars.First(c => c.Id == 1);

    Context.Cars.Remove(car);

    Assert.Throws(

      ()=>Context.SaveChanges());

  }

}

<p id="AutBody_Root1063"><strong>Проверка параллелизма</strong></p>

Если сущность имеет свойство TimeStamp, то при удалении также используется проверка параллелизма. Дополнительную информацию ищите в подразделе "Проверка параллелизма" внутри раздела "Обновление записей" ранее в главе.

<p id="AutBody_Root1064"><strong>Резюме</strong></p>
Перейти на страницу:

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных