2011-04-13 83 views
2

我很困惑实体框架ObjectContext.AcceptAllChanges。问题是,谁正在接受谁正在进行更改?ObjectContext.AcceptAllChanges!谁在接受谁正在进行更改?

一般来说,如何控制Entity Framework中的事务和事务隔离?

我是一个新用户,所以我只能编辑我自己的问题.......

谢谢你们...阿克拉姆Shahda和拉吉斯拉夫Mrnka

现在我有EF印象虽然与旧时代的“连接,事务,ADO.Net,存储过程”样式数据库访问相比,它不增加任何价值功能,但可能会增加一些潜在的安全问题并添加一些管理工作DBA(因为连接字符串需要拥有所有表的权限),并且限制某些性能改进技术的使用,特别是在某些批处理数据库操作期间。

我很高兴我仍然可以通过“Enlist”(另一个微软新词,为什么他们不只是使用“use”)来管理我自己的连接,并保留相同级别的事务和事务隔离级别的控制, TransactionScope“,我可以选择我想要的隔离级别。

现在,我对 “ObjectContext.AcceptAllChanges” 问题是:

  1. 是谁做的改变?
  2. 谁正在接受更改?

感谢......

回答

2

默认情况下AcceptAllChanges期间SaveChanges被调用。如果保存成功,则接受更改。您可以通过拨打AcceptAllChanges来关闭此功能并手动接受更改。这在一些更高级的场景中可能很有用。其中一种情况可能是处理多个事务资源的复杂事务。

例如,让我们假设我想将数据保存到数据库,并在相同的分布式事务中发送消息,MSMQ:

using (var scope = new TransactionScope()) 
{ 
    // This version will not accept changes automatically 
    context.SaveChanges(SaveOptions.DetectChangesBeforeSave); 

    // Let's assume this sends message to the message queue 
    myMessageSender.SendSomeMessage(...); 

    scope.Complete(); 

    // Now I know that transaction is completed and I can accept 
    // changes in the context 
    context.AcceptAllChanges(); 
} 

如果我没有使用手册中的例子接受错误发送消息会回滚事务(因此数据不会被持久保存到数据库中),但是我的上下文将处于所有更改都被接受的状态,并且我无法再处理它们。

+0

谢谢Akram Shahda和Ladislav Mrnka。 – BigMountainTiger 2011-04-13 20:50:37