簡體   English   中英

實體框架是否根據數據庫值進行更新?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM