如何使用Entity Framework对象上下文执行事务?

Jay*_*van 3 c# entity-framework transactionscope

我使用Entity Framework 4创建了一个非常简单的数据库.我希望能够在实体上使用事务,但我似乎无法通过回滚来保持更改.我真的只需要在将实体保存到数据库之前放弃对实体的临时更改.

例如,以下代码使用实体框架对象上下文"MusicContainer".在TransactionScope中,创建了一个Artist实体.然后交易结束而没有完成; 所以我希望这个交易可以回滚.但是,程序运行就像我从未创建过TransactionScope一样; 在TransactionScope结束后,music.SaveChanges()行将对象保存到数据库.

class Program
{
    static void Main(string[] args)
    {
        using (MusicContainer music = new MusicContainer())
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                Artist artist = new Artist { Name = "Test" };
                music.Artists.AddObject(artist);
            }
            // The transaction ended without Complete(); shouldn't the changes be abandoned?
            music.SaveChanges();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果实体框架没有像我期望的那样使用TransactionScope,我怎样才能获得我正在寻找的功能?我有几种情况,函数的调用者在MusicContainer中传递,我需要在从函数返回之前将MusicContainer保持在干净状态(即回滚更改,以便他们不会意外地保存在另一个调用的SaveChanges中在同一个MusicContainer对象上).

Bro*_*ass 7

TransactionScope在这种情况下你完全不需要,SaveChanges()只需要所有 - 如果你有另一个usingMusicContainer,这将是一个单独的事务,并不会保存当前using块中的任何更改.TransactionScope仅跨越多个DB上下文的事务需要.

一般而言,上下文仅应用于由相关操作组成的工作单元,一旦完成调用SaveChanges().为每个单独的,不相关的工作单元打开一个新的上下文.话虽如此,只需在你的场景中使用它:

        using (MusicContainer music = new MusicContainer())
        {
                Artist artist = new Artist { Name = "Test" };
                music.Artists.AddObject(artist);
                music.SaveChanges();
        }
Run Code Online (Sandbox Code Playgroud)

  • @notfed我相信开销是最小的 - 数据库连接仅在需要时由EF使用,即在调用`SaveChanges()`或进行查询时,也请查看此MSDN文章:http://msdn.microsoft.com/en -us /库/ cc853327.aspx (2认同)
  • @notfed:您必须为每个事务使用新容器.请在此处阅读:http://stackoverflow.com/questions/3653009/entity-framework-and-connection-pooling/3653392#3653392 (2认同)