From b122a641f2a36d7fa9c68c8868b676c67472791a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 18 Mar 2020 11:43:16 +0300 Subject: [PATCH] Resolved #3176: Add Initialize method for the AbpDbContext (EF Core). Also moves some initialization code from UnitOfWorkDbContextProvider to AbpDbContext. --- .../Volo/Abp/EntityFrameworkCore/AbpDbContext.cs | 15 ++++++++++++++- .../AbpEfCoreDbContextInitializationContext.cs | 14 ++++++++++++++ .../EntityFrameworkCore/IAbpEfCoreDbContext.cs | 7 +++++++ .../UnitOfWorkDbContextProvider.cs | 12 ++++++------ 4 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreDbContextInitializationContext.cs create mode 100644 framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/IAbpEfCoreDbContext.cs diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs index ba9cee70ee..6cfbe3d01c 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs @@ -28,7 +28,7 @@ using Volo.Abp.Uow; namespace Volo.Abp.EntityFrameworkCore { - public abstract class AbpDbContext : DbContext, IEfCoreDbContext, ITransientDependency + public abstract class AbpDbContext : DbContext, IAbpEfCoreDbContext, ITransientDependency where TDbContext : DbContext { protected virtual Guid? CurrentTenantId => CurrentTenant?.Id; @@ -144,6 +144,19 @@ namespace Volo.Abp.EntityFrameworkCore } } + public virtual void Initialize(AbpEfCoreDbContextInitializationContext initializationContext) + { + if (initializationContext.UnitOfWork.Options.Timeout.HasValue && + Database.IsRelational() && + !Database.GetCommandTimeout().HasValue) + { + Database.SetCommandTimeout(initializationContext.UnitOfWork.Options.Timeout.Value.TotalSeconds.To()); + } + + ChangeTracker.CascadeDeleteTiming = CascadeTiming.OnSaveChanges; + ChangeTracker.DeleteOrphansTiming = CascadeTiming.OnSaveChanges; + } + protected virtual EntityChangeReport ApplyAbpConcepts() { var changeReport = new EntityChangeReport(); diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreDbContextInitializationContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreDbContextInitializationContext.cs new file mode 100644 index 0000000000..d5e7a456ec --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreDbContextInitializationContext.cs @@ -0,0 +1,14 @@ +using Volo.Abp.Uow; + +namespace Volo.Abp.EntityFrameworkCore +{ + public class AbpEfCoreDbContextInitializationContext + { + public IUnitOfWork UnitOfWork { get; } + + public AbpEfCoreDbContextInitializationContext(IUnitOfWork unitOfWork) + { + UnitOfWork = unitOfWork; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/IAbpEfCoreDbContext.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/IAbpEfCoreDbContext.cs new file mode 100644 index 0000000000..a1eba1290f --- /dev/null +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/IAbpEfCoreDbContext.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.EntityFrameworkCore +{ + public interface IAbpEfCoreDbContext : IEfCoreDbContext + { + void Initialize(AbpEfCoreDbContextInitializationContext initializationContext); + } +} \ No newline at end of file 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 74cd8bb642..91ed2f8126 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 @@ -54,15 +54,15 @@ namespace Volo.Abp.Uow.EntityFrameworkCore { var dbContext = CreateDbContext(unitOfWork); - if (unitOfWork.Options.Timeout.HasValue && - dbContext.Database.IsRelational() && - !dbContext.Database.GetCommandTimeout().HasValue) + if (dbContext is IAbpEfCoreDbContext abpEfCoreDbContext) { - dbContext.Database.SetCommandTimeout(unitOfWork.Options.Timeout.Value.TotalSeconds.To()); + abpEfCoreDbContext.Initialize( + new AbpEfCoreDbContextInitializationContext( + unitOfWork + ) + ); } - dbContext.ChangeTracker.CascadeDeleteTiming = CascadeTiming.OnSaveChanges; - dbContext.ChangeTracker.DeleteOrphansTiming = CascadeTiming.OnSaveChanges; return dbContext; } }