解决 EF Core 使用Mysql报错 The current provider does not support ambient transactions.

在EF Core2.1之后,加了对 System.Transactions 功能(如 TransactionScope)的应用。 使用支持该功能的数据库提供程序时,这将适用于 .NET Framework 和 .NET Core。该特性也称为“氛围事务”(ambient transaction),它支持多个资源间协调事务,包括数据库、消息队列、Web服务和文件系统等。例如,开发人员可在对事务NTFS硬盘的写操作失败的情况下,自动回滚数据库更改。

举个小例

public void CreateNewTrade()
        {
            using (var scope = new TransactionScope(TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
            {
                var newTrade = new TradeRecord() { TradeType = TradeType.消费.GetEnumValue(), Amount = 10, Title = "测试交易" };
                _tradeRepository.Insert(newTrade);
                _tradeRepository.SaveChanges();

                _tradeOrderRepository.Insert(new TradeOrder() { Title = "测试订单" });
                _tradeOrderRepository.SaveChanges();
                // throw new Exception("当发生异常,将不会保存上面两步操作");
                _payInfoRepository.Insert(new Payinfo() { Status = (int)PayStatus.待付款, TradeId = newTrade.Id });
                _payInfoRepository.SaveChanges();

                scope.Complete();
            }
        }

 

解决 EF Core 使用Mysql报错 The current provider does not support ambient transactions.

不过由于2.1刚发布不后,其它数据库提供提供程序还未对Mysql的事务提供支付。因而,在连接非sqlserver数据库时,可能会提示异常:

The current provider does not support ambient transactions.

解决办法是在nuget上更新您的 数据库提供程序(Provider),您可以从 官方整理 数据库提供程序找到合适您数据库的相关Nuget包进行更新。

 

我连接的是Mysql数据库,在使用之前使用TransactionScope方法时,提示异常,

经排查Pomelo.EntityFrameworkCore.MySql还未提供事务的支持,于是在nuget上将其卸载,

重新安装 MySql.Data.EntityFrameworkCore 作为数据库提供程序。之后,一切正常。

引用官方描述

System.Transactions 的限制

  1. EF Core 依赖数据库提供程序以实现对 System.Transactions 的支持。 虽然支持在 .NET Framework 的 ADO.NET 提供程序之间十分常见,但最近才将 API 添加到 .NET Core,因此支持并未得到广泛应用。 如果提供程序未实现对 System.Transactions 的支持,则可能会完全忽略对这些 API 的调用。 SqlClient for .NET Core 从 2.1 及以上版本开始支持 System.Transactions。 尝试使用该功能时,SqlClient for .NET Core 2.0 将引发异常。

    重要

    建议你测试在依赖提供程序以管理事务之前 API 与该提供程序的行为是否正确。 如果不正确,则建议你与数据库提供程序的维护人员联系。

  2. 自版本 2.1 起,.NET Core 中的 System.Transactions 实现不包括对分布式事务的支持,因此不能使用 TransactionScopeCommittableTransaction 来跨多个资源管理器协调事务。

问题出自 http://www.kuizii.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值