实体框架如何处理某人在我下面更改数据(交易)
-
26-10-2019 - |
题
说有以下代码:
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”的属性定义概念层中的属性。
不隶属于 StackOverflow