ObjectContext.AcceptAllChanges!谁在接受以及谁在进行更改?

时间:2011-04-13 19:32:35

标签: entity-framework

我对实体框架ObjectContext.AcceptAllChanges感到困惑。问题是,谁在接受谁以及谁在做出改变?

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

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

谢谢你们...... Akram Shahda和Ladislav Mrnka

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

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

现在,关于“ObjectContext.AcceptAllChanges”的问题是:

  1. 谁在进行更改?
  2. 谁接受这些更改?
  3. 谢谢......

2 个答案:

答案 0 :(得分: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();
}

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

答案 1 :(得分:0)

对于实体框架中的事务管理,您可以参考以下链接:

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