实体框架递增列值而不查询它之前
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 的源代码并对其进行调试后,我发现最终执行的查询正是我想要的, 所以感谢大家的帮助,解决方案就在我的眼皮底下;-)
【讨论】:
以上是关于实体框架递增列值而不查询它之前的主要内容,如果未能解决你的问题,请参考以下文章