实体框架 - 在DB字段中添加或减去设定金额

时间:2014-06-13 16:37:00

标签: entity-framework

我正在使用ORM(目前正在使用的是一体化框架)开展我的第一个项目,虽然这并不是一成不变的,并且我不确定当我需要添加或减去一个给定数量时,最佳做法是什么数据库字段,当我对新值不感兴趣时​​,我知道有问题的字段经常更新,因此并发冲突是一个问题。

例如,在我正在记录销售的零售系统中,以及为销售和每个订单项创建记录时,我需要更新所售商品的库存数量。似乎没有必要在数据库中查询现有的现有数量,这样我就可以在保存更新的数量之前填充实体模型 - 并且在该往返时间内,相同的项目可能会有通过另一个结账或网站出售,所以我要么发生冲突,要么(如果使用交易)其他销售被阻止,直到我完成更新。

在SQL中,我只想写     UPDATE Item SET Quantity = Quantity-1 WHERE ...

在这种情况下,似乎最好的选择是回退到这个更新的ADO.NET +存储过程,但在实体框架中是否有更好的方法?

1 个答案:

答案 0 :(得分:1)

你是对的。 ORM专门跟踪每个实体的更改,并将这些更改单独应用于数据库。一些ORM支持在btaches中发送更改,但即便如此,修改表中的所有记录意味着全部读取它们,修改每个记录,并将更改作为单独的UPDATE发送回DB。

这是一个很大的禁忌!因为你有核心思想。它意味着将所有行加载到内存中,修改所有行,跟踪它们的更改,并将它们作为单独更新发送回数据库,这比在数据库上运行单个UPDATE更昂贵。

关于最后一个问题,要运行SQL命令,您不需要使用传统的ADO.NET。您可以使用ExecuteSqlCommand直接从EF DbContext运行SQL查询,如下所示:

MyDbContext.Database.ExecuteSqlCommand('Your SQL here!!');

我建议您查看the MSDN docs for Database class,了解可以完成的所有事情,例如管理事务,执行不返回数据的命令(如上例所示)或执行返回数据的查询,以及甚至将它们映射到模型中的实体(类):SqlQuery()

因此,您可以在不使用其他技术的情况下运行SQL命令和查询。