【问题标题】: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

标签: c# entity-framework lambda


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 2011-12-02
    • 1970-01-01
    • 2014-07-20
    • 2019-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多