我正在使用ORM(目前正在使用的是一体化框架)开展我的第一个项目,虽然这并不是一成不变的,并且我不确定当我需要添加或减去一个给定数量时,最佳做法是什么数据库字段,当我对新值不感兴趣时,我知道有问题的字段经常更新,因此并发冲突是一个问题。
例如,在我正在记录销售的零售系统中,以及为销售和每个订单项创建记录时,我需要更新所售商品的库存数量。似乎没有必要在数据库中查询现有的现有数量,这样我就可以在保存更新的数量之前填充实体模型 - 并且在该往返时间内,相同的项目可能会有通过另一个结账或网站出售,所以我要么发生冲突,要么(如果使用交易)其他销售被阻止,直到我完成更新。
在SQL中,我只想写 UPDATE Item SET Quantity = Quantity-1 WHERE ...
在这种情况下,似乎最好的选择是回退到这个更新的ADO.NET +存储过程,但在实体框架中是否有更好的方法?
答案 0 :(得分:1)
UPDATE
发送回DB。
这是一个很大的禁忌!因为你有核心思想。它意味着将所有行加载到内存中,修改所有行,跟踪它们的更改,并将它们作为单独更新发送回数据库,这比在数据库上运行单个UPDATE
更昂贵。
关于最后一个问题,要运行SQL命令,您不需要使用传统的ADO.NET。您可以使用ExecuteSqlCommand直接从EF DbContext
运行SQL查询,如下所示:
MyDbContext.Database.ExecuteSqlCommand('Your SQL here!!');
我建议您查看the MSDN docs for Database class,了解可以完成的所有事情,例如管理事务,执行不返回数据的命令(如上例所示)或执行返回数据的查询,以及甚至将它们映射到模型中的实体(类):SqlQuery()。
因此,您可以在不使用其他技术的情况下运行SQL命令和查询。