Browse Source

Resolved #3176: Add Initialize method for the AbpDbContext (EF Core).

Also moves some initialization code from UnitOfWorkDbContextProvider to AbpDbContext.
pull/3178/head
Halil İbrahim Kalkan 7 years ago
parent
commit
b122a641f2
  1. 15
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  2. 14
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpEfCoreDbContextInitializationContext.cs
  3. 7
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/IAbpEfCoreDbContext.cs
  4. 12
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Uow/EntityFrameworkCore/UnitOfWorkDbContextProvider.cs

15
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<TDbContext> : DbContext, IEfCoreDbContext, ITransientDependency
public abstract class AbpDbContext<TDbContext> : 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<int>());
}
ChangeTracker.CascadeDeleteTiming = CascadeTiming.OnSaveChanges;
ChangeTracker.DeleteOrphansTiming = CascadeTiming.OnSaveChanges;
}
protected virtual EntityChangeReport ApplyAbpConcepts()
{
var changeReport = new EntityChangeReport();

14
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;
}
}
}

7
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);
}
}

12
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<int>());
abpEfCoreDbContext.Initialize(
new AbpEfCoreDbContextInitializationContext(
unitOfWork
)
);
}
dbContext.ChangeTracker.CascadeDeleteTiming = CascadeTiming.OnSaveChanges;
dbContext.ChangeTracker.DeleteOrphansTiming = CascadeTiming.OnSaveChanges;
return dbContext;
}
}

Loading…
Cancel
Save