我有一个这样配置的属性:
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在WHERE Timestamp =
中包含UPDATE
子句,但事实并非如此。如您所见,我还尝试调用IsConcurrencyToken
(即使使用默认值true
,也可以肯定),但无济于事。
编辑:我现在通过在我的SingleAsync
调用中加入时间戳来“解决”该问题,但这仍然使我不确定是否仍然可能没有并发异常,例如Timestamp
保存时,我的实体上设置的设置显然没有被检查吗?