IsConcurrencyToken (true) фактически не проверяет токены параллелизма - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть свойство, настроенное так:

public byte[] Timestamp { get; set; }

А затем в моем DbContext я использую Fluent API следующим образом:

modelBuilder.Entity<MyClass>()
.Property(x => x.Timestamp)
.IsRowVersion()
.IsConcurrencyToken(true);

Итак, естественно, я пошел дальше и написалмодульный тест, гарантирующий, что объект с неправильной установкой временной метки не будет сохранен. Я использовал Sqlite и несколько других пользовательских Sql, чтобы заставить RowVersion работать в модульных тестах, но, к моему удивлению, я никогда не получал исключения. Затем я протестировал его в нашем приложении и также не получил исключения, когда для объекта была установлена ​​неправильная метка времени.

var myInstance = await myDbContext.Instances
.Include(x => x...)
.Include(x => x...)
.SingleAsync(x => x.Id == id);

// set other values, add new entities to relationships, aso

myInstance.Timestamp = new byte[] { 1, 2, 3, 4 };

await myDbContext.SaveChangesAsync();

Я явно что-то здесь упускаю. Я думал, что настройки IsRowVersion будет достаточно, чтобы EF Core включил в UPDATE предложение WHERE Timestamp =, но, похоже, это не так. Как вы можете видеть, я также попытался вызвать IsConcurrencyToken (даже с его значением по умолчанию true, просто чтобы быть уверенным), но безрезультатно.

Редактировать: я обошел его сейчасвключая метку времени в моем вызове SingleAsync, но это все еще оставляет меня неуверенным, если все еще возможно не получить исключение параллелизма, поскольку набор Timestamp для моей сущности, очевидно, вообще не проверяется при сохранении?

1 Ответ

0 голосов
/ 07 ноября 2019

Это известное поведение ядра EF, как описано здесь:

https://github.com/aspnet/EntityFrameworkCore/issues/18505

Изменение значения токена вручную считается неработоспособным, так как оригиналзначение, которое было запрошено из базы данных, используется для проверки параллелизма. Изменение значения вручную ничего не дает, так как оно фактически игнорируется.

...