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
Удаление неотслеживаемых сущностей
Неотслеживаемые сущности способны удалять записи таким же способом, каким они могут обновлять записи. Удаление производится вызовом 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);
}
}
Перехват отказов каскадного удаления
Когда попытка удаления записи терпит неудачу из-за правил каскадирования, то исполняющая среда 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);
}
}
Проверка параллелизма
Если сущность имеет свойство TimeStamp
Резюме
В настоящей главе было закончено построение уровня доступа к данным AutoLot
Часть VIII
Разработка клиентских приложений для Windows
Глава 24
Введение в Windows Presentation Foundation и XAML
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT