使用SQL Server事件探查器进行分析:EF6使用BEGIN TRAN
和COMMIT TRAN
包装每个存储过程调用。
这不是一个突破性的变化吗?
也许这不仅是一个突破性的变化,而且使SP中的任何事务逻辑都不可能实现,因为我们永远不能使用ROLLBACK TRAN
回滚存储过程中的事务(注意: SQL Server中没有嵌套事务),因此回滚一次将回滚到@@TRANCOUNT
零。因为我们在事务中,因为EF 6,我们得到“EXECUTE后的事务计数表明BEGIN和COMMIT语句的数量不匹配。以前的计数= 1,当前的计数=0。”标准SQL Server错误。
请不要问我为什么要调用存储过程。我有数百个,它们都使用TRY ... COMMIT ... CATCH ROLLBACK
逻辑。
有什么想法可以防止EF6这样做吗?
发布于 2014-01-27 23:10:57
db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
发布于 2015-11-21 03:38:41
正如crokusek所说,您可以设置该标志来禁用SP的事务。
如果你使用的是依赖注入(DI)库,你可以这样设置(我使用的是Simple Injector):
public partial class Startup
{
public Container ConfigureSimpleInjector(IAppBuilder app)
{
var container = new Container();
// Configure OWIN and Identity Framework
...
// Configure persistence
container.RegisterPerWebRequest<FakeDbContext>(() =>
{
var fakeDbContext = new FakeDbContext();
fakeDbContext.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
return fakeDbContext;
}
// Register other services
...
container.Verify();
// For MVC
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
return container;
}
}
https://stackoverflow.com/questions/19991609
复制相似问题