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 Core 不尊重标识列

在 Entity Framework 4.3 中增量播种数据的最佳方法

Entity Framework Core 6.0 预览4 性能改进

Entity Framework Core快速开始

Entity Framework Core 快速开始

EF6 System.Data.Entity.Core.EntityKey 在 Entity Framework Core 中的等价物是啥?