繁体   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