我找到了npgsql provider extension为实体框架核心实体设置并发令牌,它应该做这样的事情:
modelBuilder.Entity<MyEntity>(b =>
{
b.Property<uint>("xmin")
.HasColumnType("xid")
.ValueGeneratedOnAddOrUpdate()
.IsConcurrencyToken();
});
如果我理解得很好,它会在实体上创建阴影属性 .
例如,如何使用此属性跟踪ASP.NET Core中的并发更新(更多用户尝试更新同一实体)?我是否应该尝试将xmin列映射到普通属性并将其放入隐藏的输入标记中,因为它显示在asp.net core documentation中?或者还有另一种方式吗?
2 回答
实体框架会自动为您完成跟踪 .
基本上,它是这样的:
用户A加载ID为1的MyEntity .
用户B加载ID为1的MyEntity .
用户A保存对身份1的MyEntity的修改.PygreSQL会自动修改xmin列 .
用户B保存对身份1的MyEntity的修改 . 实体框架引发了一个OptimisticConcurrencyException,因为xmin的值在用户红色数据和尝试更新数据的那一刻之间发生了变化 .
从技术上讲,在此示例中,xmin值在更新语句期间的where子句中使用 . 由于xmin的值已更改,因此受UPDATE查询影响的行数为0而不是1 .
与Olivier MATROT讨论我意识到如何做我需要的 .
解决方案并不理想,因为它与提供程序绑定(SQL Server提供程序需要byte []作为并发令牌属性),但是按预期工作:
在上下文中(如果使用迁移,则需要从迁移代码中删除属性以消除列创建尝试)
编辑视图
和默认的scaffolded动作(只是为了完成示例)
因此,解决方案是将xmin值作为实体属性进行访问 .