假设有以下代码:
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
答案 0 :(得分:0)
默认情况下,是的,它会覆盖已更改的记录。如果您对应用程序感到担忧,请阅读:
http://msdn.microsoft.com/en-us/library/bb738618.aspx
默认情况下,实体框架实现乐观并发模型。这意味着在查询数据和更新数据之间,数据源中的数据不会保留锁定。实体框架将对象更改保存到数据库,而不检查并发性。对于可能经历高度并发性的实体,我们建议实体在概念层中定义一个属性,其属性为ConcurrencyMode =“fixed”.....(按照链接阅读更多内容)