[英]Entity Framework update based on database values?
在Entity Framework之前,如果我有某种产品的库存数量或订单数量,我将使用当前的数据库值来更新其数量,例如:
UPDATE Products SET AvailableQty = AvailableQty - 2 WHERE ProductId = 1;
有没有一种方法可以使用实体框架完成相同的工作? 似乎该框架遵循加载,修改,更新模式:
Product product = db.Products.FirstOrDefault(x => x.ProductId == 1);
product.AvailableQty += 2;
db.SaveChanges();
但是,采用这种方法后,产品可能会在数据的初始加载和数据更新之间发生变化。 我知道我可以在实体上有一个并发字段来阻止更新,但是在大多数情况下,我不想受到用户干预(例如客户下订单或接收采购订单)。
是否存在使用EF处理此类情况的首选方法,或者对于这些情况,我应该只使用原始SQL吗?
将您的发现和更新包含在交易中
using (var transaction = new System.Transactions.TransactionScope())
{
Product product = db.Products.FirstOrDefault(x => x.ProductId == 1);
product.AvailableQty += 2;
db.SaveChanges();
transaction.Complete();
}
“首选方法”将基于意见,因此我将集中讨论答案。 EF允许您通过DbContext的Database属性直接访问数据库。 您可以直接使用ExecuteSqlCommand执行SQL。 或者,您可以使用SqlQuery扩展方法。
ExecuteSqlCommand返回受影响的记录。 并且,SqlQuery扩展方法使您可以使用EF提供的填充。
另外,如果那还不够强大,您可以创建自己的命令,如下所示:
var direct = mydbContext.Database;
using (var command = direct.Connection.CreateCommand())
{
if (command.Connection.State != ConnectionState.Open)
{
command.Connection.Open();
}
command.CommandText = query.ToString(); // Some query built with StringBuilder.
command.Parameters.Add(new SqlParameter("@id", someId));
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
... code here ...
reader.Close();
}
command.Connection.Close();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.