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

时间:2011-11-30 22:54:29

标签: c# .net entity-framework entity-framework-4.1

假设有以下代码:

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();
}

如果有人在我检索订单后更新订单(在FindOne电话中?),EF是否会有任何关心?

或者它是否会愉快地覆盖在检索数据和调用SaveChanges之间所做的任何更改?

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

其中任何一个如何知道我需要在事务中拥有哪些行。 (仅仅因为我读了一行并不意味着我想要它被锁定。或者它是否锁定模型中的所有表(yuck))。

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

1 个答案:

答案 0 :(得分:0)

默认情况下,是的,它会覆盖已更改的记录。如果您对应用程序感到担忧,请阅读:

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

  

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