IsConcurrencyToken(true)实际上并不检查并发令牌

我有一个这样配置的属性:

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保存时,我的实体上设置的设置显然没有被检查吗?

lnaszzl 回答:IsConcurrencyToken(true)实际上并不检查并发令牌

这是EF核心的已知行为,如此处记录:

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

手动更改令牌的值被视为无操作,因为从数据库查询的原始值正用于并发检查。手动更改该值无济于事,因为它实际上已被忽略。

本文链接:https://www.f2er.com/3146452.html

大家都在问