实体框架递增列值而不查询它之前

Posted

技术标签:

【中文标题】实体框架递增列值而不查询它之前【英文标题】:Entity Framework Incrementing column value without query it before 【发布时间】:2017-05-13 13:28:55 【问题描述】:

我有一个带有“contacts”表的 sql server,在这个表中我有 int 类型的列“clicks”,我想在不进行查询的情况下增加它的值。

这是:“Entity framework update one column by increasing the current value by one without select”的副本 建议的解决方案是使用EntityFramework.Utilities 问题是它不是像 EntityFramework.Extended 这样的 IQueryable 扩展,这让我很难实现。

问题是否有任何其他方法/解决方案可以使用 IQueryable(不实际编写 sql 查询)在 sql 上增加 int 值?

IQueryable 查询的结果应如下所示:

UPDATE Contacts SET clicks=clicks+1 WHERE id=8432

【问题讨论】:

在sql server中查找SEQUENCE; msdn.microsoft.com/en-us/library/ff878091.aspx 我没有找到任何简单的方法来使用 sql server SEQUENCE 和实体框架 您正试图用锤子驱动螺丝。您所要求的与序列、ID 或实体无关。这意味着您没有对象或映射,因此您不需要 ORM。正确的方法是使用例如 eSQL 或原始 SQL 来使用参数执行 UPDATE 语句。更好的是,创建并调用存储过程 另一个非常重要的问题。原始代码不会受到并发冲突的影响。进行多少并发更新并不重要,该值始终正确递增。另一方面,多个线程在客户端更新值并保存它们的任何尝试都将导致并发冲突。 @MohammadBarbast 我不确定它是否相同,但下面的解决方案基于使用称为 EF Extended 的额外库,目前称为 EF plus,请参阅:entityframework-plus.net/ef-core-batch-update 【参考方案1】:

我刚刚在一些研究和测试后找到了解决方案,实际上 EntityFramework.Extended 完全按照我的意愿去做,如果你想增加一列,只需调用 Update 方法并添加分配:

db.Contacts.Where(c => c.Id == id).Update(c => new Contact  Clicks = c.Clicks + 1 );

在检查 EntityFramework.Extended 的源代码并对其进行调试后,我发现最终执行的查询正是我想要的, 所以感谢大家的帮助,解决方案就在我的眼皮底下;-)

【讨论】:

以上是关于实体框架递增列值而不查询它之前的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot:仅访问 JPA 中的关联列值而不获取完整的关联实体

在 SQL 查询中使用文本字段值而不提交它

实体框架,查询包含上下文更改的dbset,而不调用保存更改

Laravel减少列值而不是负值

使用相同的 ID 列递增地对列值求和

如何在mysql,php的单个查询中设置与自动递增ID值相同的任何列值[重复]