Категории
Самые читаемые
ChitatKnigi.com » 🟢Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

Читать онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
1 ... 470 471 472 473 474 475 476 477 478 ... 642
Перейти на страницу:

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать

@p2=0x0000000000008665

exec sp_executesql N'SELECT TOP(1) [i].[Id], [i].[Color],

     [i].[IsDrivable], [i].[MakeId], [i].[PetName], [i].[TimeStamp]

FROM [dbo].[Inventory] AS [i]

WHERE [i].[Id] = @__p_0',N'@__p_0 int',@__p_0=1

Удаление записей

Одиночная сущность помечается для удаления путем вызова Remove() на DbSet<T> или установки ее состояния в Deleted. Список записей помечается для удаления вызовом RemoveRange() на DbSet<T>. Процесс удаления будет вызывать эффекты каскадирования для навигационных свойств на основе правил, сконфигурированных в методе OnModelCreating() (и регламентированных соглашениями EF Core). Если удаление не допускается из -за политики каскадирования, тогда генерируется исключение.

Состояние сущности

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

Удаление отслеживаемых сущностей

Процесс удаления зеркально отображает процесс обновления. Как только сущность начала отслеживаться, вызовите 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;

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

DELETE FROM [dbo].[Inventory]

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

SELECT @@ROWCOUNT;'

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

@p1=0x0000000000008680

Удаление неотслеживаемых сущностей

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

В показанном ниже тесте сначала читается запись как неотслеживаемая и на основе записи создается новый экземпляр класса Car. Затем либо устанавливается состояние в Deleted, либо применяется метод Remove() класса DbSet<T> (в зависимости от того, какая строка кода закомментирована) и вызывается 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);

  }

}

Перехват отказов каскадного удаления

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

[Fact]

public void ShouldFailToRemoveACar()

{

  ExecuteInATransaction(RunTheTest);

   void RunTheTest()

1 ... 470 471 472 473 474 475 476 477 478 ... 642
Перейти на страницу:
Отывы о книге
Открыть боковую панель
Комментарии
Ксения
Ксения 25.01.2025 - 12:30
Неплохая подборка книг. Прочитаю все однозначно.
Jonna
Jonna 02.01.2025 - 01:03
Страстно🔥 очень страстно
Ксения
Ксения 20.12.2024 - 00:16
Через чур правильный герой. Поэтому и остался один
Настя
Настя 08.12.2024 - 03:18
Прочла с удовольствием. Необычный сюжет с замечательной концовкой
Марина
Марина 08.12.2024 - 02:13
Не могу понять, где продолжение... Очень интересная история, хочется прочесть далее