实体框架如何处理在我下面更改数据的人(事务)

本文关键字:事务 数据 框架 何处理 实体 处理 | 更新日期: 2023-09-27 18:16:30

假设有以下代码:

public void SaveOrUpdate(OrderContract orderContract)
{
   foreach (var orderContract in orderContract.Tests)
   {
      Order order=dataAccess.FindOne<Order>(x=>x.OrderId==orderContract.OrderId) 
                  ?? new Order();
      // Where there are updates, put the stuff in the 
      // contract over what we already had.
      Mapper.Map(orderContract, order);
       // if it is new then add it in so it is inserted by EF.
      if (orderedTest.OrderedTestId <= 0)
          dataAccess.Add(orderedTest);
   }
   dataAccess.SaveChanges();
}

EF是否有任何东西会关心是否有人在我检索它之后更新订单(在FindOne调用中)?

或者它会很高兴地覆盖在检索数据和调用SaveChanges之间所做的任何更改吗?

如果它不这样做,那么呼叫ObjectContext.Connection.BeginTransaction是最好的保护我吗?或者我应该使用new TransactionScope()吗?

它们怎么知道事务中需要哪些行呢?(仅仅因为我读了一行并不意味着我想要锁定它。或者它会锁定模型中的所有表(讨厌))。

注意:我运行的SQL Server 2008 R2和EF 4.1

实体框架如何处理在我下面更改数据的人(事务)

默认情况下,是,它将覆盖更改的记录。如果你担心你的应用会出现这种情况,请阅读以下内容:

http://msdn.microsoft.com/en-us/library/bb738618.aspx

默认情况下,实体框架实现乐观并发模型。这意味着在查询数据和更新数据之间不会对数据源中的数据持有锁。实体框架将对象更改保存到数据库,而不检查并发性。对于可能经历高度并发的实体,我们建议实体在概念层定义一个属性,属性为ConcurrencyMode="fixed".....(点击链接阅读更多)