[英]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.