У меня есть свойство, настроенное так:
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
для моей сущности, очевидно, вообще не проверяется при сохранении?