如何为ObjectContext设置TransactionHandler?
我正在检查此示例:Handling of Transaction Commit Failures,但它仅针对DbContext显示。
答案 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
。