添加dbcontext类型发现接口用来判断如果存在分表路由那么必须是分表数据库上下文,将多个接口合并到IShardingDbContext接口上,并且默认的ShellDbContext接口支持track的直接调用
This commit is contained in:
parent
c528a4a83c
commit
05ce4b06ba
|
@ -131,7 +131,7 @@ namespace Sample.MySql
|
||||||
{
|
{
|
||||||
b.ReplaceService<IMigrationsSqlGenerator, ShardingMySqlMigrationsSqlGenerator>();
|
b.ReplaceService<IMigrationsSqlGenerator, ShardingMySqlMigrationsSqlGenerator>();
|
||||||
});
|
});
|
||||||
}).ReplaceService<ITableEnsureManager, MySqlTableEnsureManager>()
|
})
|
||||||
.AddShardingCore();
|
.AddShardingCore();
|
||||||
// services.AddDbContext<DefaultShardingDbContext>(ShardingCoreExtension
|
// services.AddDbContext<DefaultShardingDbContext>(ShardingCoreExtension
|
||||||
// .UseMutliDefaultSharding<DefaultShardingDbContext>);
|
// .UseMutliDefaultSharding<DefaultShardingDbContext>);
|
||||||
|
|
|
@ -22,7 +22,7 @@ using ShardingCore.Sharding;
|
||||||
namespace Samples.AbpSharding
|
namespace Samples.AbpSharding
|
||||||
{
|
{
|
||||||
|
|
||||||
public abstract class AbstractShardingAbpDbContext<TDbContext> : AbpDbContext<TDbContext>, IShardingDbContext, ISupportShardingReadWrite
|
public abstract class AbstractShardingAbpDbContext<TDbContext> : AbpDbContext<TDbContext>, IShardingDbContext
|
||||||
where TDbContext : DbContext
|
where TDbContext : DbContext
|
||||||
{
|
{
|
||||||
private readonly IShardingDbContextExecutor _shardingDbContextExecutor;
|
private readonly IShardingDbContextExecutor _shardingDbContextExecutor;
|
||||||
|
@ -571,5 +571,9 @@ namespace Samples.AbpSharding
|
||||||
return _shardingDbContextExecutor.GetVirtualDataSource();
|
return _shardingDbContextExecutor.GetVirtualDataSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IDictionary<string, IDataSourceDbContext> GetCurrentDbContexts()
|
||||||
|
{
|
||||||
|
return _shardingDbContextExecutor.GetCurrentDbContexts();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -28,9 +28,7 @@ namespace Samples.AbpSharding
|
||||||
{
|
{
|
||||||
public abstract class AbstractShardingAbpZeroDbContext<TTenant, TRole, TUser, TSelf>
|
public abstract class AbstractShardingAbpZeroDbContext<TTenant, TRole, TUser, TSelf>
|
||||||
: AbpZeroDbContext<TTenant, TRole, TUser, TSelf>,
|
: AbpZeroDbContext<TTenant, TRole, TUser, TSelf>,
|
||||||
IShardingDbContext,
|
IShardingDbContext
|
||||||
ISupportShardingReadWrite,
|
|
||||||
IShardingTableDbContext
|
|
||||||
where TTenant : AbpTenant<TUser>
|
where TTenant : AbpTenant<TUser>
|
||||||
where TRole : AbpRole<TUser>
|
where TRole : AbpRole<TUser>
|
||||||
where TUser : AbpUser<TUser>
|
where TUser : AbpUser<TUser>
|
||||||
|
@ -650,5 +648,9 @@ namespace Samples.AbpSharding
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
public IDictionary<string, IDataSourceDbContext> GetCurrentDbContexts()
|
||||||
|
{
|
||||||
|
return _shardingDbContextExecutor.GetCurrentDbContexts();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using ShardingCore.Core.DbContextCreator;
|
using ShardingCore.Core.DbContextCreator;
|
||||||
|
using ShardingCore.Core.DbContextTypeAwares;
|
||||||
using ShardingCore.Core.EntityMetadatas;
|
using ShardingCore.Core.EntityMetadatas;
|
||||||
using ShardingCore.Core.ServiceProviders;
|
using ShardingCore.Core.ServiceProviders;
|
||||||
using ShardingCore.Core.ShardingConfigurations.Abstractions;
|
using ShardingCore.Core.ShardingConfigurations.Abstractions;
|
||||||
|
@ -9,7 +10,7 @@ using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Jobs;
|
using ShardingCore.Jobs;
|
||||||
using ShardingCore.Jobs.Abstaractions;
|
using ShardingCore.Jobs.Abstaractions;
|
||||||
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
||||||
using ShardingCore.Sharding.ParallelTables;
|
using ShardingCore.Sharding.ParallelTables;
|
||||||
|
|
||||||
|
@ -20,18 +21,25 @@ namespace ShardingCore.Bootstrappers
|
||||||
{
|
{
|
||||||
private readonly ILogger<ShardingBootstrapper> _logger;
|
private readonly ILogger<ShardingBootstrapper> _logger;
|
||||||
private readonly IShardingProvider _shardingProvider;
|
private readonly IShardingProvider _shardingProvider;
|
||||||
|
private readonly IDbContextTypeAware _dbContextTypeAware;
|
||||||
private readonly IShardingRouteConfigOptions _routeConfigOptions;
|
private readonly IShardingRouteConfigOptions _routeConfigOptions;
|
||||||
private readonly IEntityMetadataManager _entityMetadataManager;
|
private readonly IEntityMetadataManager _entityMetadataManager;
|
||||||
private readonly IParallelTableManager _parallelTableManager;
|
private readonly IParallelTableManager _parallelTableManager;
|
||||||
private readonly DoOnlyOnce _doOnlyOnce = new DoOnlyOnce();
|
private readonly DoOnlyOnce _doOnlyOnce = new DoOnlyOnce();
|
||||||
|
|
||||||
public ShardingInitializer(IShardingProvider shardingProvider,ILogger<ShardingBootstrapper> logger)
|
public ShardingInitializer(IShardingProvider shardingProvider,
|
||||||
|
IDbContextTypeAware dbContextTypeAware,
|
||||||
|
IShardingRouteConfigOptions shardingRouteConfigOptions,
|
||||||
|
IEntityMetadataManager entityMetadataManager,
|
||||||
|
IParallelTableManager parallelTableManager,
|
||||||
|
ILogger<ShardingBootstrapper> logger)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_shardingProvider = shardingProvider;
|
_shardingProvider = shardingProvider;
|
||||||
_routeConfigOptions = shardingProvider.GetRequiredService<IShardingRouteConfigOptions>();
|
_dbContextTypeAware = dbContextTypeAware;
|
||||||
_entityMetadataManager = shardingProvider.GetRequiredService<IEntityMetadataManager>();
|
_routeConfigOptions = shardingRouteConfigOptions;
|
||||||
_parallelTableManager = shardingProvider.GetRequiredService<IParallelTableManager>();
|
_entityMetadataManager = entityMetadataManager;
|
||||||
|
_parallelTableManager = parallelTableManager;
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化
|
/// 初始化
|
||||||
|
@ -63,6 +71,18 @@ namespace ShardingCore.Bootstrappers
|
||||||
var entityMetadataInitializer =(IEntityMetadataInitializer)_shardingProvider.CreateInstance(entityMetadataInitializerType);
|
var entityMetadataInitializer =(IEntityMetadataInitializer)_shardingProvider.CreateInstance(entityMetadataInitializerType);
|
||||||
entityMetadataInitializer.Initialize();
|
entityMetadataInitializer.Initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var allShardingEntities = _entityMetadataManager.GetAllShardingEntities();
|
||||||
|
//判断如果有分表的对象那么dbcontext必须继承IShardingTableDbContext
|
||||||
|
if (allShardingEntities.Any(o => _entityMetadataManager.IsShardingTable(o)))
|
||||||
|
{
|
||||||
|
var contextType = _dbContextTypeAware.GetContextType();
|
||||||
|
if (!contextType.IsShardingTableDbContext())
|
||||||
|
{
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"db context {contextType},has sharding table route,should be implement {nameof(IShardingTableDbContext)}");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitializeParallelTables()
|
private void InitializeParallelTables()
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.DbContextTypeAwares;
|
||||||
|
|
||||||
|
public class DbContextTypeAware:IDbContextTypeAware
|
||||||
|
{
|
||||||
|
private readonly Type _dbContextType;
|
||||||
|
|
||||||
|
public DbContextTypeAware(Type dbContextType)
|
||||||
|
{
|
||||||
|
_dbContextType = dbContextType;
|
||||||
|
}
|
||||||
|
public Type GetContextType()
|
||||||
|
{
|
||||||
|
return _dbContextType;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ShardingCore.Core.DbContextTypeAwares;
|
||||||
|
|
||||||
|
public interface IDbContextTypeAware
|
||||||
|
{
|
||||||
|
Type GetContextType();
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ using System;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using ShardingCore.Core.DbContextCreator;
|
using ShardingCore.Core.DbContextCreator;
|
||||||
|
using ShardingCore.Core.DbContextTypeAwares;
|
||||||
using ShardingCore.Core.EntityMetadatas;
|
using ShardingCore.Core.EntityMetadatas;
|
||||||
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
||||||
using ShardingCore.Core.QueryTrackers;
|
using ShardingCore.Core.QueryTrackers;
|
||||||
|
@ -28,6 +29,7 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
public interface IShardingRuntimeContext
|
public interface IShardingRuntimeContext
|
||||||
{
|
{
|
||||||
Type DbContextType { get; }
|
Type DbContextType { get; }
|
||||||
|
IDbContextTypeAware GetDbContextTypeAware();
|
||||||
IShardingProvider GetShardingProvider();
|
IShardingProvider GetShardingProvider();
|
||||||
ShardingConfigOptions GetShardingConfigOptions();
|
ShardingConfigOptions GetShardingConfigOptions();
|
||||||
IShardingRouteConfigOptions GetShardingRouteConfigOptions();
|
IShardingRouteConfigOptions GetShardingRouteConfigOptions();
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace ShardingCore.Core.RuntimeContexts
|
|
||||||
{
|
|
||||||
public interface IShardingRuntimeContextManager
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 尝试获取注册的dbcontext type对应的 没有返回null
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="dbContextType"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
IShardingRuntimeContext TryGet(Type dbContextType);
|
|
||||||
|
|
||||||
IReadOnlyDictionary<Type, IShardingRuntimeContext> GetAll();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using ShardingCore.Bootstrappers;
|
using ShardingCore.Bootstrappers;
|
||||||
using ShardingCore.Core.DbContextCreator;
|
using ShardingCore.Core.DbContextCreator;
|
||||||
|
using ShardingCore.Core.DbContextTypeAwares;
|
||||||
using ShardingCore.Core.EntityMetadatas;
|
using ShardingCore.Core.EntityMetadatas;
|
||||||
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
||||||
using ShardingCore.Core.QueryTrackers;
|
using ShardingCore.Core.QueryTrackers;
|
||||||
|
@ -72,9 +73,15 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
{
|
{
|
||||||
GetRequiredService<IShardingBootstrapper>().AutoShardingCreate();
|
GetRequiredService<IShardingBootstrapper>().AutoShardingCreate();
|
||||||
}
|
}
|
||||||
|
private IDbContextTypeAware _dbContextTypeAware;
|
||||||
|
public IDbContextTypeAware GetDbContextTypeAware()
|
||||||
|
{
|
||||||
|
return _dbContextTypeAware??=GetRequiredService<IDbContextTypeAware>();
|
||||||
|
}
|
||||||
|
|
||||||
private IShardingProvider _shardingProvider;
|
private IShardingProvider _shardingProvider;
|
||||||
|
|
||||||
|
|
||||||
public IShardingProvider GetShardingProvider()
|
public IShardingProvider GetShardingProvider()
|
||||||
{
|
{
|
||||||
return _shardingProvider??=GetRequiredService<IShardingProvider>();
|
return _shardingProvider??=GetRequiredService<IShardingProvider>();
|
||||||
|
@ -314,6 +321,7 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
|
|
||||||
private void InitFieldValue()
|
private void InitFieldValue()
|
||||||
{
|
{
|
||||||
|
GetDbContextTypeAware();
|
||||||
GetShardingProvider();
|
GetShardingProvider();
|
||||||
GetShardingConfigOptions();
|
GetShardingConfigOptions();
|
||||||
GetShardingRouteConfigOptions();
|
GetShardingRouteConfigOptions();
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Collections.Immutable;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace ShardingCore.Core.RuntimeContexts
|
|
||||||
{
|
|
||||||
|
|
||||||
public class ShardingRuntimeContextManager:IShardingRuntimeContextManager
|
|
||||||
{
|
|
||||||
private readonly ImmutableDictionary<Type, IShardingRuntimeContext> _caches;
|
|
||||||
public ShardingRuntimeContextManager(IEnumerable<IShardingRuntimeContext> shardingRuntimeContexts)
|
|
||||||
{
|
|
||||||
_caches = shardingRuntimeContexts.ToImmutableDictionary(o => o.DbContextType, o => o);
|
|
||||||
}
|
|
||||||
public IShardingRuntimeContext TryGet(Type dbContextType)
|
|
||||||
{
|
|
||||||
if (_caches.TryGetValue(dbContextType, out var shardingRuntimeContext))
|
|
||||||
{
|
|
||||||
return shardingRuntimeContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IReadOnlyDictionary<Type, IShardingRuntimeContext> GetAll()
|
|
||||||
{
|
|
||||||
return _caches;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -26,9 +26,9 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
public override bool HasChanges()
|
public override bool HasChanges()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover currentDbContextDiscover)
|
if (_dbContext is IShardingDbContext shardingDbContext)
|
||||||
{
|
{
|
||||||
return currentDbContextDiscover.GetCurrentDbContexts().Any(o =>
|
return shardingDbContext.GetCurrentDbContexts().Any(o =>
|
||||||
o.Value.GetCurrentContexts().Any(r => r.Value.ChangeTracker.HasChanges()));
|
o.Value.GetCurrentContexts().Any(r => r.Value.ChangeTracker.HasChanges()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,9 +37,9 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
public override IEnumerable<EntityEntry> Entries()
|
public override IEnumerable<EntityEntry> Entries()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover currentDbContextDiscover)
|
if (_dbContext is IShardingDbContext shardingDbContext)
|
||||||
{
|
{
|
||||||
return currentDbContextDiscover.GetCurrentDbContexts().SelectMany(o =>
|
return shardingDbContext.GetCurrentDbContexts().SelectMany(o =>
|
||||||
o.Value.GetCurrentContexts().SelectMany(cd => cd.Value.ChangeTracker.Entries()));
|
o.Value.GetCurrentContexts().SelectMany(cd => cd.Value.ChangeTracker.Entries()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,9 +48,9 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
public override IEnumerable<EntityEntry<TEntity>> Entries<TEntity>()
|
public override IEnumerable<EntityEntry<TEntity>> Entries<TEntity>()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover currentDbContextDiscover)
|
if (_dbContext is IShardingDbContext shardingDbContext)
|
||||||
{
|
{
|
||||||
return currentDbContextDiscover.GetCurrentDbContexts().SelectMany(o =>
|
return shardingDbContext.GetCurrentDbContexts().SelectMany(o =>
|
||||||
o.Value.GetCurrentContexts().SelectMany(cd => cd.Value.ChangeTracker.Entries<TEntity>()));
|
o.Value.GetCurrentContexts().SelectMany(cd => cd.Value.ChangeTracker.Entries<TEntity>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
public override void DetectChanges()
|
public override void DetectChanges()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover)
|
if (_dbContext is IShardingDbContext)
|
||||||
{
|
{
|
||||||
Do(c => c.DetectChanges());
|
Do(c => c.DetectChanges());
|
||||||
return;
|
return;
|
||||||
|
@ -69,7 +69,7 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
public override void AcceptAllChanges()
|
public override void AcceptAllChanges()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover)
|
if (_dbContext is IShardingDbContext)
|
||||||
{
|
{
|
||||||
Do(c => c.AcceptAllChanges());
|
Do(c => c.AcceptAllChanges());
|
||||||
return;
|
return;
|
||||||
|
@ -79,7 +79,7 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
private void Do(Action<ChangeTracker> action)
|
private void Do(Action<ChangeTracker> action)
|
||||||
{
|
{
|
||||||
var dataSourceDbContexts = ((ICurrentDbContextDiscover)_dbContext).GetCurrentDbContexts();
|
var dataSourceDbContexts = ((IShardingDbContext)_dbContext).GetCurrentDbContexts();
|
||||||
foreach (var dataSourceDbContext in dataSourceDbContexts)
|
foreach (var dataSourceDbContext in dataSourceDbContexts)
|
||||||
{
|
{
|
||||||
var currentContexts = dataSourceDbContext.Value.GetCurrentContexts();
|
var currentContexts = dataSourceDbContext.Value.GetCurrentContexts();
|
||||||
|
@ -113,7 +113,7 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
|
|
||||||
public override void CascadeChanges()
|
public override void CascadeChanges()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover)
|
if (_dbContext is IShardingDbContext)
|
||||||
{
|
{
|
||||||
Do(c => c.CascadeChanges());
|
Do(c => c.CascadeChanges());
|
||||||
return;
|
return;
|
||||||
|
@ -125,7 +125,7 @@ namespace ShardingCore.EFCores.ChangeTrackers
|
||||||
#if !NETCOREAPP2_0 && !NETCOREAPP3_0
|
#if !NETCOREAPP2_0 && !NETCOREAPP3_0
|
||||||
public override void Clear()
|
public override void Clear()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover)
|
if (_dbContext is IShardingDbContext)
|
||||||
{
|
{
|
||||||
Do(c => c.Clear());
|
Do(c => c.Clear());
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -29,21 +29,28 @@ namespace ShardingCore.EFCores
|
||||||
#if NET6_0
|
#if NET6_0
|
||||||
public ShardingRelationalTransaction(IShardingDbContext shardingDbContext, IRelationalConnection connection, DbTransaction transaction, Guid transactionId, IDiagnosticsLogger<DbLoggerCategory.Database.Transaction> logger, bool transactionOwned, ISqlGenerationHelper sqlGenerationHelper) : base(connection, transaction, transactionId, logger, transactionOwned, sqlGenerationHelper)
|
public ShardingRelationalTransaction(IShardingDbContext shardingDbContext, IRelationalConnection connection, DbTransaction transaction, Guid transactionId, IDiagnosticsLogger<DbLoggerCategory.Database.Transaction> logger, bool transactionOwned, ISqlGenerationHelper sqlGenerationHelper) : base(connection, transaction, transactionId, logger, transactionOwned, sqlGenerationHelper)
|
||||||
{
|
{
|
||||||
_shardingDbContext = shardingDbContext ?? throw new ShardingCoreInvalidOperationException($"should implement {nameof(IShardingDbContext)}");
|
_shardingDbContext =
|
||||||
|
shardingDbContext ?? throw new ShardingCoreInvalidOperationException($"should implement {nameof(IShardingDbContext)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if NETCOREAPP3_0 || NET5_0
|
#if NETCOREAPP3_0 || NET5_0
|
||||||
public ShardingRelationalTransaction(IShardingDbContext shardingDbContext, IRelationalConnection connection, DbTransaction transaction, Guid transactionId, IDiagnosticsLogger<DbLoggerCategory.Database.Transaction> logger, bool transactionOwned) : base(connection, transaction, transactionId, logger, transactionOwned)
|
public ShardingRelationalTransaction(IShardingDbContext shardingDbContext, IRelationalConnection connection,
|
||||||
|
DbTransaction transaction, Guid transactionId,
|
||||||
|
IDiagnosticsLogger<DbLoggerCategory.Database.Transaction> logger, bool transactionOwned) : base(connection,
|
||||||
|
transaction, transactionId, logger, transactionOwned)
|
||||||
{
|
{
|
||||||
_shardingDbContext = shardingDbContext??throw new ShardingCoreInvalidOperationException($"should implement {nameof(IShardingDbContext)}");
|
_shardingDbContext = shardingDbContext ??
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"should implement {nameof(IShardingDbContext)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#if NETCOREAPP2_0
|
#if NETCOREAPP2_0
|
||||||
public ShardingRelationalTransaction(IShardingDbContext shardingDbContext, IRelationalConnection connection, DbTransaction transaction,IDiagnosticsLogger<DbLoggerCategory.Database.Transaction> logger, bool transactionOwned) : base(connection, transaction, logger, transactionOwned)
|
public ShardingRelationalTransaction(IShardingDbContext shardingDbContext, IRelationalConnection connection, DbTransaction transaction,IDiagnosticsLogger<DbLoggerCategory.Database.Transaction> logger, bool transactionOwned) : base(connection, transaction, logger, transactionOwned)
|
||||||
{
|
{
|
||||||
_shardingDbContext = shardingDbContext??throw new ShardingCoreInvalidOperationException($"should implement {nameof(IShardingDbContext)}");
|
_shardingDbContext =
|
||||||
|
shardingDbContext??throw new ShardingCoreInvalidOperationException($"should implement {nameof(IShardingDbContext)}");
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -54,9 +61,7 @@ namespace ShardingCore.EFCores
|
||||||
// base.ClearTransaction();
|
// base.ClearTransaction();
|
||||||
// _supportShardingTransaction.NotifyShardingTransaction(null);
|
// _supportShardingTransaction.NotifyShardingTransaction(null);
|
||||||
// }
|
// }
|
||||||
//}
|
//}f
|
||||||
|
|
||||||
|
|
||||||
public override void Commit()
|
public override void Commit()
|
||||||
{
|
{
|
||||||
base.Commit();
|
base.Commit();
|
||||||
|
@ -72,7 +77,6 @@ namespace ShardingCore.EFCores
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !NETCOREAPP2_0
|
#if !NETCOREAPP2_0
|
||||||
|
|
||||||
public override async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken())
|
public override async Task RollbackAsync(CancellationToken cancellationToken = new CancellationToken())
|
||||||
{
|
{
|
||||||
await base.RollbackAsync(cancellationToken);
|
await base.RollbackAsync(cancellationToken);
|
||||||
|
@ -88,6 +92,13 @@ namespace ShardingCore.EFCores
|
||||||
await _shardingDbContext.CommitAsync(cancellationToken);
|
await _shardingDbContext.CommitAsync(cancellationToken);
|
||||||
_shardingDbContext.NotifyShardingTransaction();
|
_shardingDbContext.NotifyShardingTransaction();
|
||||||
}
|
}
|
||||||
|
// #if !NETCOREAPP3_0
|
||||||
|
// public override void CreateSavepoint(string name)
|
||||||
|
// {
|
||||||
|
// AAA
|
||||||
|
// base.CreateSavepoint(name);
|
||||||
|
// }
|
||||||
|
// #endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -21,7 +21,7 @@ namespace ShardingCore.EFCores
|
||||||
|
|
||||||
public override IEnumerator<TEntity> GetEnumerator()
|
public override IEnumerator<TEntity> GetEnumerator()
|
||||||
{
|
{
|
||||||
if (_dbContext is ICurrentDbContextDiscover currentDbContextDiscover)
|
if (_dbContext is IShardingDbContext currentDbContextDiscover)
|
||||||
{
|
{
|
||||||
var dataSourceDbContexts = currentDbContextDiscover.GetCurrentDbContexts();
|
var dataSourceDbContexts = currentDbContextDiscover.GetCurrentDbContexts();
|
||||||
var enumerators = dataSourceDbContexts.SelectMany(o => o.Value.GetCurrentContexts().Select(cd=>cd.Value.Set<TEntity>().Local.GetEnumerator()));
|
var enumerators = dataSourceDbContexts.SelectMany(o => o.Value.GetCurrentContexts().Select(cd=>cd.Value.Set<TEntity>().Local.GetEnumerator()));
|
||||||
|
|
|
@ -20,7 +20,6 @@ namespace ShardingCore.Extensions
|
||||||
*/
|
*/
|
||||||
public static class ShardingReadWriteExtension
|
public static class ShardingReadWriteExtension
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置读写分离读取写数据库
|
/// 设置读写分离读取写数据库
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -28,14 +27,10 @@ namespace ShardingCore.Extensions
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static bool ReadWriteSeparationWriteOnly(this IShardingDbContext shardingDbContext)
|
public static bool ReadWriteSeparationWriteOnly(this IShardingDbContext shardingDbContext)
|
||||||
{
|
{
|
||||||
if (shardingDbContext is ISupportShardingReadWrite supportShardingReadWrite)
|
shardingDbContext.SetReadWriteSeparation(false);
|
||||||
{
|
return true;
|
||||||
supportShardingReadWrite.SetReadWriteSeparation(false);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置读写分离读读数据库
|
/// 设置读写分离读读数据库
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -43,23 +38,19 @@ namespace ShardingCore.Extensions
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static bool ReadWriteSeparationReadOnly(this IShardingDbContext shardingDbContext)
|
public static bool ReadWriteSeparationReadOnly(this IShardingDbContext shardingDbContext)
|
||||||
{
|
{
|
||||||
if (shardingDbContext is ISupportShardingReadWrite supportShardingReadWrite)
|
shardingDbContext.SetReadWriteSeparation(true);
|
||||||
{
|
return true;
|
||||||
supportShardingReadWrite.SetReadWriteSeparation(true);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 设置读写分离
|
/// 设置读写分离
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="supportShardingReadWrite"></param>
|
/// <param name="supportShardingReadWrite"></param>
|
||||||
/// <param name="readOnly">是否是读数据源</param>
|
/// <param name="readOnly">是否是读数据源</param>
|
||||||
private static void SetReadWriteSeparation(this ISupportShardingReadWrite supportShardingReadWrite, bool readOnly)
|
private static void SetReadWriteSeparation(this IShardingDbContext supportShardingReadWrite, bool readOnly)
|
||||||
{
|
{
|
||||||
var shardingRuntimeContext = ((DbContext)supportShardingReadWrite).GetShardingRuntimeContext();
|
var shardingRuntimeContext = ((DbContext)supportShardingReadWrite).GetShardingRuntimeContext();
|
||||||
var shardingReadWriteManager =shardingRuntimeContext.GetService<IShardingReadWriteManager>();
|
var shardingReadWriteManager = shardingRuntimeContext.GetService<IShardingReadWriteManager>();
|
||||||
var shardingReadWriteContext = shardingReadWriteManager.GetCurrent();
|
var shardingReadWriteContext = shardingReadWriteManager.GetCurrent();
|
||||||
if (shardingReadWriteContext != null)
|
if (shardingReadWriteContext != null)
|
||||||
{
|
{
|
||||||
|
@ -68,13 +59,17 @@ namespace ShardingCore.Extensions
|
||||||
supportShardingReadWrite.ReadWriteSeparationPriority = shardingReadWriteContext.DefaultPriority + 1;
|
supportShardingReadWrite.ReadWriteSeparationPriority = shardingReadWriteContext.DefaultPriority + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
supportShardingReadWrite.ReadWriteSeparation = readOnly;
|
supportShardingReadWrite.ReadWriteSeparation = readOnly;
|
||||||
}
|
}
|
||||||
public static void SetReadWriteSeparation(this ShardingReadWriteContext shardingReadWriteContext,int priority, bool readOnly)
|
|
||||||
|
public static void SetReadWriteSeparation(this ShardingReadWriteContext shardingReadWriteContext, int priority,
|
||||||
|
bool readOnly)
|
||||||
{
|
{
|
||||||
shardingReadWriteContext.DefaultPriority = priority;
|
shardingReadWriteContext.DefaultPriority = priority;
|
||||||
shardingReadWriteContext.DefaultReadEnable = readOnly;
|
shardingReadWriteContext.DefaultReadEnable = readOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 当前dbcontext是否是启用了读写分离
|
/// 当前dbcontext是否是启用了读写分离
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -82,30 +77,27 @@ namespace ShardingCore.Extensions
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static bool CurrentIsReadWriteSeparation(this IShardingDbContext shardingDbContext)
|
public static bool CurrentIsReadWriteSeparation(this IShardingDbContext shardingDbContext)
|
||||||
{
|
{
|
||||||
if (shardingDbContext is ISupportShardingReadWrite shardingReadWrite)
|
if (shardingDbContext.IsUseReadWriteSeparation())
|
||||||
{
|
{
|
||||||
if (shardingDbContext.IsUseReadWriteSeparation())
|
var shardingRuntimeContext = ((DbContext)shardingDbContext).GetShardingRuntimeContext();
|
||||||
|
var shardingReadWriteManager = shardingRuntimeContext.GetService<IShardingReadWriteManager>();
|
||||||
|
var shardingReadWriteContext = shardingReadWriteManager.GetCurrent();
|
||||||
|
if (shardingReadWriteContext != null)
|
||||||
{
|
{
|
||||||
var shardingRuntimeContext = ((DbContext)shardingDbContext).GetShardingRuntimeContext();
|
if (shardingReadWriteContext.DefaultPriority > shardingDbContext.ReadWriteSeparationPriority)
|
||||||
var shardingReadWriteManager =shardingRuntimeContext.GetService<IShardingReadWriteManager>();
|
|
||||||
var shardingReadWriteContext = shardingReadWriteManager.GetCurrent();
|
|
||||||
if (shardingReadWriteContext != null)
|
|
||||||
{
|
{
|
||||||
if (shardingReadWriteContext.DefaultPriority > shardingReadWrite.ReadWriteSeparationPriority)
|
return shardingReadWriteContext.DefaultReadEnable;
|
||||||
{
|
}
|
||||||
return shardingReadWriteContext.DefaultReadEnable;
|
else
|
||||||
}
|
{
|
||||||
else
|
return shardingDbContext.ReadWriteSeparation;
|
||||||
{
|
|
||||||
return shardingReadWrite.ReadWriteSeparation;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return shardingReadWrite.ReadWriteSeparation;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return shardingDbContext.ReadWriteSeparation;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,7 +25,7 @@ namespace ShardingCore.Sharding
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 分表分库的dbcontext
|
/// 分表分库的dbcontext
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class AbstractShardingDbContext : DbContext, IShardingDbContext, ISupportShardingReadWrite,ICurrentDbContextDiscover
|
public abstract class AbstractShardingDbContext : DbContext, IShardingDbContext
|
||||||
{
|
{
|
||||||
protected IShardingDbContextExecutor ShardingDbContextExecutor { get; }
|
protected IShardingDbContextExecutor ShardingDbContextExecutor { get; }
|
||||||
|
|
||||||
|
@ -429,7 +429,7 @@ namespace ShardingCore.Sharding
|
||||||
{
|
{
|
||||||
using (var tran = await Database.BeginTransactionAsync(cancellationToken))
|
using (var tran = await Database.BeginTransactionAsync(cancellationToken))
|
||||||
{
|
{
|
||||||
i = await ShardingDbContextExecutor.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
|
i = await ShardingDbContextExecutor.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
|
||||||
#if NETCOREAPP2_0
|
#if NETCOREAPP2_0
|
||||||
tran.Commit();
|
tran.Commit();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace ShardingCore.Sharding.Abstractions
|
||||||
* @Date: Saturday, 14 August 2021 21:47:11
|
* @Date: Saturday, 14 August 2021 21:47:11
|
||||||
* @Email: 326308290@qq.com
|
* @Email: 326308290@qq.com
|
||||||
*/
|
*/
|
||||||
public interface IShardingDbContext: IShardingTransaction
|
public interface IShardingDbContext: IShardingTransaction,ISupportShardingReadWrite,ICurrentDbContextDiscover
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// create DbContext
|
/// create DbContext
|
||||||
|
|
|
@ -31,6 +31,7 @@ using Microsoft.EntityFrameworkCore.ChangeTracking.Internal;
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
using ShardingCore.Bootstrappers;
|
using ShardingCore.Bootstrappers;
|
||||||
using ShardingCore.Core.DbContextCreator;
|
using ShardingCore.Core.DbContextCreator;
|
||||||
|
using ShardingCore.Core.DbContextTypeAwares;
|
||||||
using ShardingCore.Core.QueryTrackers;
|
using ShardingCore.Core.QueryTrackers;
|
||||||
using ShardingCore.Core.RuntimeContexts;
|
using ShardingCore.Core.RuntimeContexts;
|
||||||
using ShardingCore.Core.ShardingConfigurations.ConfigBuilders;
|
using ShardingCore.Core.ShardingConfigurations.ConfigBuilders;
|
||||||
|
@ -93,22 +94,6 @@ namespace ShardingCore
|
||||||
return services.AddShardingConfigure<TShardingDbContext>();
|
return services.AddShardingConfigure<TShardingDbContext>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ShardingCoreConfigBuilder<TShardingDbContext> AddMultiShardingDbContext<TShardingDbContext>(
|
|
||||||
this IServiceCollection services,
|
|
||||||
ServiceLifetime contextLifetime = ServiceLifetime.Scoped,
|
|
||||||
ServiceLifetime optionsLifetime = ServiceLifetime.Scoped)
|
|
||||||
where TShardingDbContext : DbContext, IShardingDbContext
|
|
||||||
{
|
|
||||||
if (contextLifetime == ServiceLifetime.Singleton)
|
|
||||||
throw new NotSupportedException($"{nameof(contextLifetime)}:{nameof(ServiceLifetime.Singleton)}");
|
|
||||||
if (optionsLifetime == ServiceLifetime.Singleton)
|
|
||||||
throw new NotSupportedException($"{nameof(optionsLifetime)}:{nameof(ServiceLifetime.Singleton)}");
|
|
||||||
services.AddDbContext<TShardingDbContext>(UseMutliDefaultSharding<TShardingDbContext>, contextLifetime,
|
|
||||||
optionsLifetime);
|
|
||||||
services.TryAddSingleton<IShardingRuntimeContextManager, ShardingRuntimeContextManager>();
|
|
||||||
return services.AddShardingConfigure<TShardingDbContext>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static ShardingCoreConfigBuilder<TShardingDbContext> AddShardingConfigure<TShardingDbContext>(
|
public static ShardingCoreConfigBuilder<TShardingDbContext> AddShardingConfigure<TShardingDbContext>(
|
||||||
this IServiceCollection services)
|
this IServiceCollection services)
|
||||||
where TShardingDbContext : DbContext, IShardingDbContext
|
where TShardingDbContext : DbContext, IShardingDbContext
|
||||||
|
@ -131,20 +116,6 @@ namespace ShardingCore
|
||||||
dbContextOptionsBuilder.UseDefaultSharding<TShardingDbContext>(shardingRuntimeContext);
|
dbContextOptionsBuilder.UseDefaultSharding<TShardingDbContext>(shardingRuntimeContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void UseMutliDefaultSharding<TShardingDbContext>(IServiceProvider serviceProvider,
|
|
||||||
DbContextOptionsBuilder dbContextOptionsBuilder) where TShardingDbContext : DbContext, IShardingDbContext
|
|
||||||
{
|
|
||||||
var shardingRuntimeContextManager = serviceProvider.GetRequiredService<IShardingRuntimeContextManager>();
|
|
||||||
var shardingRuntimeContext = shardingRuntimeContextManager.TryGet(typeof(TShardingDbContext));
|
|
||||||
if (shardingRuntimeContext == null)
|
|
||||||
{
|
|
||||||
throw new InvalidOperationException(
|
|
||||||
$"cant get multi sharding runtime context:[{typeof(TShardingDbContext)}]");
|
|
||||||
}
|
|
||||||
|
|
||||||
dbContextOptionsBuilder.UseDefaultSharding<TShardingDbContext>(shardingRuntimeContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static DbContextOptionsBuilder UseDefaultSharding<TShardingDbContext>(this DbContextOptionsBuilder dbContextOptionsBuilder,
|
public static DbContextOptionsBuilder UseDefaultSharding<TShardingDbContext>(this DbContextOptionsBuilder dbContextOptionsBuilder,
|
||||||
IShardingRuntimeContext shardingRuntimeContext) where TShardingDbContext : DbContext, IShardingDbContext
|
IShardingRuntimeContext shardingRuntimeContext) where TShardingDbContext : DbContext, IShardingDbContext
|
||||||
{
|
{
|
||||||
|
@ -164,6 +135,7 @@ namespace ShardingCore
|
||||||
internal static IServiceCollection AddInternalShardingCore<TShardingDbContext>(this IServiceCollection services)
|
internal static IServiceCollection AddInternalShardingCore<TShardingDbContext>(this IServiceCollection services)
|
||||||
where TShardingDbContext : DbContext, IShardingDbContext
|
where TShardingDbContext : DbContext, IShardingDbContext
|
||||||
{
|
{
|
||||||
|
services.TryAddSingleton<IDbContextTypeAware>(sp=>new DbContextTypeAware(typeof(TShardingDbContext)));
|
||||||
services.TryAddSingleton<IShardingInitializer, ShardingInitializer>();
|
services.TryAddSingleton<IShardingInitializer, ShardingInitializer>();
|
||||||
services.TryAddSingleton<IShardingBootstrapper, ShardingBootstrapper>();
|
services.TryAddSingleton<IShardingBootstrapper, ShardingBootstrapper>();
|
||||||
services.TryAddSingleton<IDataSourceInitializer, DataSourceInitializer>();
|
services.TryAddSingleton<IDataSourceInitializer, DataSourceInitializer>();
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.EntityFrameworkCore;
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
|
||||||
using ShardingCore.TableExists.Abstractions;
|
|
||||||
|
|
||||||
namespace ShardingCore.TableExists
|
|
||||||
{
|
|
||||||
public class EmptyTableEnsureManager : ITableEnsureManager
|
|
||||||
{
|
|
||||||
public ISet<string> GetExistTables(IShardingDbContext shardingDbContext, string dataSourceName)
|
|
||||||
{
|
|
||||||
return new HashSet<string>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue