ObjectContext的SetTransactionHandler

时间:2014-06-22 20:11:41

标签: c# entity-framework

如何为ObjectContext设置TransactionHandler?

我正在检查此示例:Handling of Transaction Commit Failures,但它仅针对DbContext显示。

2 个答案:

答案 0 :(得分:2)

TransactionHandler也适用于ObjectContext。唯一的问题是在实例化第一个DbContext之前不评估基于代码的配置(DbConfiguration)。

两种可能的解决方法

Dummy DbContext:

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
    {
        SetTransactionHandler(SqlProviderServices.ProviderInvariantName, 
            () => new CommitFailureHandler());
    }
}

public class TestContext : DbContext { }

static void Main(string[] args)
{
    // instantiate DbContext to initialize code based configuration
    using (var db = new TestContext()) { }

    using (var db = new TransactionHandlerDemoEntities()) {
        var handler = db.TransactionHandler; // should be CommitFailureHandler

        db.AddToDemoTable(new DemoTable { Name = "TestEntiry1" });
        db.SaveChanges();
    }
}

或DbConfiguration.Loaded事件

static void Main(string[] args)
{
    DbConfiguration.Loaded += DbConfiguration_Loaded;

    using (var db = new TransactionHandlerDemoEntities()) {
        var handler = db.TransactionHandler;

        db.AddToDemoTable(new DemoTable { Name = "TestEntiry1" });
        db.SaveChanges();
    }
}

static void DbConfiguration_Loaded(object sender, DbConfigurationLoadedEventArgs e)
{
    e.AddDependencyResolver(new TransactionHandlerResolver(
        () => new CommitFailureHandler(),
        SqlProviderServices.ProviderInvariantName,
        null),true);
}

TransactionHandlerDemoEntities是一个ObjectContext。

答案 1 :(得分:0)

这仅适用于DbContext。如果可以,请尽快将基于ObjectContext的应用程序重构为DbContext。我认为会出现更多新功能,只能使用DbContext API。有一天,ObjectContext甚至可能会被弃用为公共API。

你可以create a DbContext from an ObjectContext,但我认为这对你没什么帮助。毫无疑问,主要问题是数据逻辑的其余部分目前需要ObjectContext