首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EF6将每个存储过程调用包装在它自己的事务中。如何防止这种情况发生?

EF6将每个存储过程调用包装在它自己的事务中。如何防止这种情况发生?
EN

Stack Overflow用户
提问于 2013-11-15 09:02:25
回答 2查看 11.3K关注 0票数 35

使用SQL Server事件探查器进行分析:EF6使用BEGIN TRANCOMMIT TRAN包装每个存储过程调用。

这不是一个突破性的变化吗?

也许这不仅是一个突破性的变化,而且使SP中的任何事务逻辑都不可能实现,因为我们永远不能使用ROLLBACK TRAN回滚存储过程中的事务(注意: SQL Server中没有嵌套事务),因此回滚一次将回滚到@@TRANCOUNT零。因为我们在事务中,因为EF 6,我们得到“EXECUTE后的事务计数表明BEGIN和COMMIT语句的数量不匹配。以前的计数= 1,当前的计数=0。”标准SQL Server错误。

请不要问我为什么要调用存储过程。我有数百个,它们都使用TRY ... COMMIT ... CATCH ROLLBACK逻辑。

有什么想法可以防止EF6这样做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-27 23:10:57

db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
票数 38
EN

Stack Overflow用户

发布于 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;
     }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19991609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档