在实体框架之前,如果我有产品的库存数量或订单数量,我会使用当前数据库值更新它的数量:
UPDATE Products SET AvailableQty = AvailableQty - 2 WHERE ProductId = 1;
有没有办法用Entity Framework完成同样的事情?框架似乎遵循加载,修改,更新模式:
Product product = db.Products.FirstOrDefault(x => x.ProductId == 1);
product.AvailableQty += 2;
db.SaveChanges();
但是,遵循此方法,产品可能会在数据的初始加载和数据更新之间发生变化。我知道我可以在实体上有一个阻止更新的并发字段,但在大多数情况下我不想让用户干预(例如客户下订单或收到采购订单)。
是否有使用EF处理这类情况的首选方法,或者我应该在这些情况下回退到原始SQL?
答案 0 :(得分:2)
在事务中附上您的查找和更新
using (var transaction = new System.Transactions.TransactionScope())
{
Product product = db.Products.FirstOrDefault(x => x.ProductId == 1);
product.AvailableQty += 2;
db.SaveChanges();
transaction.Complete();
}
答案 1 :(得分:1)
"首选方法"会以意见为基础,所以我只专注于答案。 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();
}
}