说有以下代码:

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()?

这些如何知道我需要在交易中需要什么行。 (仅仅因为我读了一行并不意味着我要它锁定。或者它锁定模型中的所有表(yuck))。

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

有帮助吗?

解决方案

默认情况下,是的,它将覆盖更改的记录。如果您为应用程序担心它,请阅读以下内容:

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

默认情况下,实体框架实现了乐观的并发模型。这意味着在查询数据和更新数据之间的数据源中的数据中不保留锁。实体框架将对象保存到数据库中,而无需检查并发。对于可能经历高度并发的实体,我们建议该实体使用concurrencyMode =“ recited”的属性定义概念层中的属性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top