From aad83726c7efcbc09ca733dc2d9a5395f5ef3957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 25 Sep 2017 22:02:59 +0300 Subject: [PATCH] Refactored. --- .../DbContextEfCoreTransactionStrategy.cs | 46 ------------ ...extDatabaseApi.cs => EfCoreDatabaseApi.cs} | 4 +- .../EfCoreTransactionApi.cs | 2 +- .../IEfCoreTransactionApi.cs | 15 ---- .../IEfCoreTransactionStrategy.cs | 11 --- .../UnitOfWorkDbContextProvider.cs | 72 ++++++++++++++----- 6 files changed, 59 insertions(+), 91 deletions(-) delete mode 100644 src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextEfCoreTransactionStrategy.cs rename src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/{DbContextDatabaseApi.cs => EfCoreDatabaseApi.cs} (79%) delete mode 100644 src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionApi.cs delete mode 100644 src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionStrategy.cs diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextEfCoreTransactionStrategy.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextEfCoreTransactionStrategy.cs deleted file mode 100644 index b1da0f8a71..0000000000 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextEfCoreTransactionStrategy.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Data; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.DependencyInjection; -using Volo.Abp.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore.DependencyInjection; - -namespace Volo.Abp.Uow.EntityFrameworkCore -{ - public class DbContextEfCoreTransactionStrategy : IEfCoreTransactionStrategy, ITransientDependency - { - public TDbContext CreateDbContext(IUnitOfWork unitOfWork, DbContextCreationContext creationContext) where TDbContext : DbContext - { - var transactionApiKey = $"EntityFrameworkCore_{creationContext.ConnectionString}"; - var activeTransaction = unitOfWork.FindTransactionApi(transactionApiKey) as IEfCoreTransactionApi; - - TDbContext dbContext; - if (activeTransaction == null) - { - dbContext = unitOfWork.ServiceProvider.GetRequiredService(); - var dbtransaction = dbContext.Database.BeginTransaction((unitOfWork.Options.IsolationLevel ?? IsolationLevel.ReadUncommitted)); - activeTransaction = new EfCoreTransactionApi(dbtransaction, dbContext); - unitOfWork.AddTransactionApi(transactionApiKey, activeTransaction); - } - else - { - creationContext.ExistingConnection = activeTransaction.DbContextTransaction.GetDbTransaction().Connection; - dbContext = unitOfWork.ServiceProvider.GetRequiredService(); - - if (dbContext.HasRelationalTransactionManager()) - { - dbContext.Database.UseTransaction(activeTransaction.DbContextTransaction.GetDbTransaction()); - } - else - { - dbContext.Database.BeginTransaction(); - } - - activeTransaction.AttendedDbContexts.Add(dbContext); - } - - return dbContext; - } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextDatabaseApi.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs similarity index 79% rename from src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextDatabaseApi.cs rename to src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs index 41fb5b8610..b73b237000 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/DbContextDatabaseApi.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreDatabaseApi.cs @@ -4,12 +4,12 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.Uow.EntityFrameworkCore { - public class DbContextDatabaseApi : IDatabaseApi, ISupportsSavingChanges + public class EfCoreDatabaseApi : IDatabaseApi, ISupportsSavingChanges where TDbContext : AbpDbContext { public TDbContext DbContext { get; } - public DbContextDatabaseApi(TDbContext dbContext) + public EfCoreDatabaseApi(TDbContext dbContext) { DbContext = dbContext; } diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs index 4bedb5e0ea..f5016f7bda 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/EfCoreTransactionApi.cs @@ -6,7 +6,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.Uow.EntityFrameworkCore { - public class EfCoreTransactionApi : IEfCoreTransactionApi + public class EfCoreTransactionApi : ITransactionApi { public IDbContextTransaction DbContextTransaction { get; } public DbContext StarterDbContext { get; } diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionApi.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionApi.cs deleted file mode 100644 index 881b8d202b..0000000000 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionApi.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Storage; - -namespace Volo.Abp.Uow.EntityFrameworkCore -{ - public interface IEfCoreTransactionApi : ITransactionApi - { - IDbContextTransaction DbContextTransaction { get; } - - DbContext StarterDbContext { get; } - - List AttendedDbContexts { get; } - } -} \ No newline at end of file diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionStrategy.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionStrategy.cs deleted file mode 100644 index 9536e4cad8..0000000000 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/IEfCoreTransactionStrategy.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using Volo.Abp.EntityFrameworkCore.DependencyInjection; - -namespace Volo.Abp.Uow.EntityFrameworkCore -{ - public interface IEfCoreTransactionStrategy - { - TDbContext CreateDbContext(IUnitOfWork unitOfWork, DbContextCreationContext creationContext) - where TDbContext : DbContext; - } -} diff --git a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs index b4f573b26d..596fc72917 100644 --- a/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs +++ b/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs @@ -1,5 +1,6 @@ using System; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; @@ -14,16 +15,13 @@ namespace Volo.Abp.Uow.EntityFrameworkCore { private readonly IUnitOfWorkManager _unitOfWorkManager; private readonly IConnectionStringResolver _connectionStringResolver; - private readonly IEfCoreTransactionStrategy _transactionStrategy; public UnitOfWorkDbContextProvider( IUnitOfWorkManager unitOfWorkManager, - IConnectionStringResolver connectionStringResolver, - IEfCoreTransactionStrategy transactionStrategy) + IConnectionStringResolver connectionStringResolver) { _unitOfWorkManager = unitOfWorkManager; _connectionStringResolver = connectionStringResolver; - _transactionStrategy = transactionStrategy; } public TDbContext GetDbContext() @@ -41,11 +39,11 @@ namespace Volo.Abp.Uow.EntityFrameworkCore var databaseApi = unitOfWork.GetOrAddDatabaseApi( dbContextKey, - () => new DbContextDatabaseApi( + () => new EfCoreDatabaseApi( CreateDbContext(unitOfWork, connectionStringName, connectionString) )); - return ((DbContextDatabaseApi)databaseApi).DbContext; + return ((EfCoreDatabaseApi)databaseApi).DbContext; } private TDbContext CreateDbContext(IUnitOfWork unitOfWork, string connectionStringName, string connectionString) @@ -53,16 +51,7 @@ namespace Volo.Abp.Uow.EntityFrameworkCore var creationContext = new DbContextCreationContext(connectionStringName, connectionString); using (DbContextCreationContext.Use(creationContext)) { - TDbContext dbContext; - - if (unitOfWork.Options.IsTransactional == true) - { - dbContext = _transactionStrategy.CreateDbContext(unitOfWork, creationContext); - } - else - { - dbContext = unitOfWork.ServiceProvider.GetRequiredService(); - } + var dbContext = CreateDbContext(unitOfWork); if (unitOfWork.Options.Timeout.HasValue && dbContext.Database.IsRelational() && @@ -74,5 +63,56 @@ namespace Volo.Abp.Uow.EntityFrameworkCore return dbContext; } } + + private TDbContext CreateDbContext(IUnitOfWork unitOfWork) + { + return unitOfWork.Options.IsTransactional + ? CreateDbContextWithTransaction(unitOfWork) + : unitOfWork.ServiceProvider.GetRequiredService(); + } + + public TDbContext CreateDbContextWithTransaction(IUnitOfWork unitOfWork) + { + var transactionApiKey = $"EntityFrameworkCore_{DbContextCreationContext.Current.ConnectionString}"; + var activeTransaction = unitOfWork.FindTransactionApi(transactionApiKey) as EfCoreTransactionApi; + + if (activeTransaction == null) + { + var dbContext = unitOfWork.ServiceProvider.GetRequiredService(); + + var dbtransaction = unitOfWork.Options.IsolationLevel.HasValue + ? dbContext.Database.BeginTransaction(unitOfWork.Options.IsolationLevel.Value) + : dbContext.Database.BeginTransaction(); + + unitOfWork.AddTransactionApi( + transactionApiKey, + new EfCoreTransactionApi( + dbtransaction, + dbContext + ) + ); + + return dbContext; + } + else + { + DbContextCreationContext.Current.ExistingConnection = activeTransaction.DbContextTransaction.GetDbTransaction().Connection; + + var dbContext = unitOfWork.ServiceProvider.GetRequiredService(); + + if (dbContext.HasRelationalTransactionManager()) + { + dbContext.Database.UseTransaction(activeTransaction.DbContextTransaction.GetDbTransaction()); + } + else + { + dbContext.Database.BeginTransaction(); //TODO: Why not using the new created transaction? + } + + activeTransaction.AttendedDbContexts.Add(dbContext); + + return dbContext; + } + } } } \ No newline at end of file