Entity Framework Core 增量整数
Posted
技术标签:
【中文标题】Entity Framework Core 增量整数【英文标题】:Entity Framework Core increment integer 【发布时间】:2021-11-16 15:04:57 【问题描述】:我正在寻找与以下 SQL 语句等效的 EF Core C#:
UPDATE TheTable
SET RevisionId = RevisionId + 1
WHERE notPk = @someValue
解决方案不应受到竞争条件的影响。
【问题讨论】:
Stack Overflow 是一个问答网站,而不是代码翻译服务。尝试先自己翻译代码,然后在遇到困难时来找我们,确保向我们展示您尝试过的内容并创建minimal reproducible example。 没有。ExecuteInterpolated
它
EF Core 是一个对象关系映射器,而不是嵌入式 SQL 库。 LINQ 不是 SQL 的替代品,它是一种在 ORM 之上运行的语言。您发布的声明涉及哪些对象?
我认为这是一个合理的问题,不是很好,但可以。问题是更新的原子性。在数据库之外并没有真正安全的好方法,因此您只需要通过连接执行原始 SQL。
嘿@DavidG,等待 100K 命中 :) 提前恭喜,以防我错过。
【参考方案1】:
不使用 EF(Core 与否)。
就这么简单。
标准 EF 无法发出此 SQL,它需要加载、增量、保存。
这会自动导致容易以一种或另一种方式出现竞争条件(您可以使用版本字段来捕获它们并引发错误)。
您从字面上直奔对象/关系映射器的设计限制。他们有效地处理了 90% 的案件......
您可以做的是手动发出此 SQL - 有多种方法可以通过 EfCore 执行自定义 SQL。这就是你可以用剩下的 10% 做的事情。
可能有第三方扩展允许通过 EfCore 生成更新。 IE。 https://entityframework-extensions.net/update-from-query - 他们可以做到。
【讨论】:
你可以使用并发标记(虽然不是字面上的SET foo = foo + 1
)。是否愿意是下一个问题。
@CodeCaster 或使用显式事务。在这两种情况下,这都类似于用大炮杀死苍蝇。
虽然两者并不完全一样,但可能会导致未来出现问题。我通常会使用上述扩展来做到这一点。
扩展是否也允许递增?我刚刚看到替换值以上是关于Entity Framework Core 增量整数的主要内容,如果未能解决你的问题,请参考以下文章
在 Entity Framework 4.3 中增量播种数据的最佳方法
Entity Framework Core 6.0 预览4 性能改进
EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?