如何使用 Entity Framework 和工作单元在数据库级别自行更新列?

How can update a column by itself on db Level with Entity Framework and Unit of Work?

我正在使用 Entity Framework 和工作单元。

我在 Person table 中有一个小数列 OrderBalance 并且我有一个 Order table。我想在数据库级别自行更新 orderbalance 列以支持并发订单创建。

我想插入一个订单并使用原子性更新 OrderBalance 列(全有或全无)。

public override void Create(Order order)
{
        _orderReposiory.Add(order);

        var person = _personRepository.GetById(order.PersonId);
        person.OrderBalance += order.Amount*order.Price;

        _personRepository.Edit(person);

        _unitOfWork.Commit();
}

如您所见,“+=”进程处于对象级别。如何在不破坏原子性的情况下在数据库级别执行此操作?

您需要在两个存储库中使用相同的 DbContext 实例。如果你这样做,那么你可以将任意数量的 inserts/updates 包装在一个交易中,这将给你全部或一无所有。 EF 语句将自动加入任何待处理的事务。

using (var tran = dbContext.Database.BeginTransaction()) 
{
  // your updates here
}

我正在将 ExeceutSqlCommand 与 transactionscope 一起使用,它可以正常工作。

public class PersonRepository : GenericRepository<Person>, IPersonRepository
  {  
      public void UpdateOrderBalance(decimal amount,long personId)
        {
            Entities.Database.ExecuteSqlCommand("Update Person set OrderBalance=OrderBalance+@p0 where id=@p1", amount,personId);
        }
   }

我已将我的创建方法更改为此

  public override void Create(Order order)
        {
          using (var scope = new System.Transactions.TransactionScope())
            {
                _orderReposiory.Add(order);
                AddOrderBalancePerson(order);
                _unitOfWork.Commit();
                scope.Complete();
            }
        }



   private void AddOrderBalancePerson(Order order)
    {
        _personRepository.UpdateOrderBalance(order.Amount*order.Price, order.PersonId);
    }

Entities in PersonRepositoryUnitofWork 使用相同的 Dbcontext