diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs index ca18146225..9ea6ffef19 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs @@ -18,6 +18,8 @@ namespace Volo.Abp.Uow.EntityFrameworkCore; public class UnitOfWorkDbContextProvider : IDbContextProvider where TDbContext : IEfCoreDbContext { + private const string TransactionsNotSupportedErrorMessage = "Current database does not support transactions. Your database may remain in an inconsistent state in an error case."; + public ILogger> Logger { get; set; } private readonly IUnitOfWorkManager _unitOfWorkManager; @@ -170,19 +172,29 @@ public class UnitOfWorkDbContextProvider : IDbContextProvider(); - var dbtransaction = unitOfWork.Options.IsolationLevel.HasValue - ? dbContext.Database.BeginTransaction(unitOfWork.Options.IsolationLevel.Value) - : dbContext.Database.BeginTransaction(); - - unitOfWork.AddTransactionApi( - transactionApiKey, - new EfCoreTransactionApi( - dbtransaction, - dbContext, - _cancellationTokenProvider - ) - ); - + try + { + var dbtransaction = unitOfWork.Options.IsolationLevel.HasValue + ? dbContext.Database.BeginTransaction(unitOfWork.Options.IsolationLevel.Value) + : dbContext.Database.BeginTransaction(); + + unitOfWork.AddTransactionApi( + transactionApiKey, + new EfCoreTransactionApi( + dbtransaction, + dbContext, + _cancellationTokenProvider + ) + ); + } + catch (Exception e) when (e is InvalidOperationException || e is NotSupportedException) + { + Logger.LogError(TransactionsNotSupportedErrorMessage); + Logger.LogException(e); + + return dbContext; + } + return dbContext; } else @@ -199,25 +211,45 @@ public class UnitOfWorkDbContextProvider : IDbContextProvider : IDbContextProvider(); - var dbTransaction = unitOfWork.Options.IsolationLevel.HasValue - ? await dbContext.Database.BeginTransactionAsync(unitOfWork.Options.IsolationLevel.Value, GetCancellationToken()) - : await dbContext.Database.BeginTransactionAsync(GetCancellationToken()); - - unitOfWork.AddTransactionApi( - transactionApiKey, - new EfCoreTransactionApi( - dbTransaction, - dbContext, - _cancellationTokenProvider - ) - ); + try + { + var dbTransaction = unitOfWork.Options.IsolationLevel.HasValue + ? await dbContext.Database.BeginTransactionAsync(unitOfWork.Options.IsolationLevel.Value, GetCancellationToken()) + : await dbContext.Database.BeginTransactionAsync(GetCancellationToken()); + + unitOfWork.AddTransactionApi( + transactionApiKey, + new EfCoreTransactionApi( + dbTransaction, + dbContext, + _cancellationTokenProvider + ) + ); + } + catch (Exception e) when (e is InvalidOperationException || e is NotSupportedException) + { + Logger.LogError(TransactionsNotSupportedErrorMessage); + Logger.LogException(e); + + return dbContext; + } return dbContext; } @@ -264,30 +306,50 @@ public class UnitOfWorkDbContextProvider : IDbContextProvider : IMongoDbContextProvider where TMongoDbContext : IAbpMongoDbContext { + private const string TransactionsNotSupportedErrorMessage = "Current database does not support transactions. Your database may remain in an inconsistent state in an error case."; public ILogger> Logger { get; set; } private readonly IUnitOfWorkManager _unitOfWorkManager; @@ -78,7 +79,7 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext dbContextKey, () => new MongoDbDatabaseApi(CreateDbContext(unitOfWork, mongoUrl, databaseName))); - return (TMongoDbContext)((MongoDbDatabaseApi)databaseApi).DbContext; + return (TMongoDbContext)((MongoDbDatabaseApi) databaseApi).DbContext; } public async Task GetDbContextAsync(CancellationToken cancellationToken = default) @@ -117,7 +118,7 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext unitOfWork.AddDatabaseApi(dbContextKey, databaseApi); } - return (TMongoDbContext)((MongoDbDatabaseApi)databaseApi).DbContext; + return (TMongoDbContext)((MongoDbDatabaseApi) databaseApi).DbContext; } [Obsolete("Use CreateDbContextAsync")] @@ -190,7 +191,7 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext } catch (NotSupportedException e) { - Logger.LogError("The current MongoDB database does not support transactions, All operations will be performed in non-transactions, This may cause errors."); + Logger.LogError(TransactionsNotSupportedErrorMessage); Logger.LogException(e); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, null); @@ -241,7 +242,7 @@ public class UnitOfWorkMongoDbContextProvider : IMongoDbContext } catch (NotSupportedException e) { - Logger.LogError("The current MongoDB database does not support transactions, All operations will be performed in non-transactions, This may cause errors."); + Logger.LogError(TransactionsNotSupportedErrorMessage); Logger.LogException(e); dbContext.ToAbpMongoDbContext().InitializeDatabase(database, client, null);