移除命名空间和不必要的参数
This commit is contained in:
parent
14e6a1d4a5
commit
86455805f0
|
@ -4,8 +4,9 @@
|
||||||
<!--默认统一输出XML注释文档,不需要输出的项目可以单独关闭-->
|
<!--默认统一输出XML注释文档,不需要输出的项目可以单独关闭-->
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<Authors>xuejmnet</Authors>
|
<Authors>xuejmnet</Authors>
|
||||||
<RepositoryUrl>https://github.com/xuejmnet/sharding-core</RepositoryUrl>
|
<RepositoryUrl>https://github.com/dotnetcore/sharding-core</RepositoryUrl>
|
||||||
<RepositoryType>git</RepositoryType>
|
<RepositoryType>git</RepositoryType>
|
||||||
|
<PackageProjectUrl>https://github.com/dotnetcore/sharding-core</PackageProjectUrl>
|
||||||
<Company>xuejm</Company>
|
<Company>xuejm</Company>
|
||||||
<LangVersion>10.0</LangVersion>
|
<LangVersion>10.0</LangVersion>
|
||||||
<Description>high performance lightweight solution for efcore sharding table and sharding database support read-write-separation </Description>
|
<Description>high performance lightweight solution for efcore sharding table and sharding database support read-write-separation </Description>
|
||||||
|
|
|
@ -14,7 +14,7 @@ using ShardingCore.Extensions;
|
||||||
using ShardingCore.Helpers;
|
using ShardingCore.Helpers;
|
||||||
using ShardingCore.Jobs;
|
using ShardingCore.Jobs;
|
||||||
using ShardingCore.Jobs.Abstaractions;
|
using ShardingCore.Jobs.Abstaractions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -13,7 +13,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.Logger;
|
|
||||||
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
||||||
using ShardingCore.Sharding.ParallelTables;
|
using ShardingCore.Sharding.ParallelTables;
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,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.Logger;
|
|
||||||
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
using ShardingCore.Sharding.MergeEngines.ParallelControl;
|
||||||
using ShardingCore.Sharding.ParallelTables;
|
using ShardingCore.Sharding.ParallelTables;
|
||||||
|
|
||||||
|
@ -25,9 +25,9 @@ namespace ShardingCore.Bootstrappers
|
||||||
private readonly IParallelTableManager _parallelTableManager;
|
private readonly IParallelTableManager _parallelTableManager;
|
||||||
private readonly DoOnlyOnce _doOnlyOnce = new DoOnlyOnce();
|
private readonly DoOnlyOnce _doOnlyOnce = new DoOnlyOnce();
|
||||||
|
|
||||||
public ShardingInitializer(IShardingProvider shardingProvider)
|
public ShardingInitializer(IShardingProvider shardingProvider,ILogger<ShardingBootstrapper> logger)
|
||||||
{
|
{
|
||||||
_logger = ShardingLoggerFactory.DefaultFactory.CreateLogger<ShardingBootstrapper>();
|
_logger = logger;
|
||||||
_shardingProvider = shardingProvider;
|
_shardingProvider = shardingProvider;
|
||||||
_routeConfigOptions = shardingProvider.GetRequiredService<IShardingRouteConfigOptions>();
|
_routeConfigOptions = shardingProvider.GetRequiredService<IShardingRouteConfigOptions>();
|
||||||
_entityMetadataManager = shardingProvider.GetRequiredService<IEntityMetadataManager>();
|
_entityMetadataManager = shardingProvider.GetRequiredService<IEntityMetadataManager>();
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Metadata;
|
using Microsoft.EntityFrameworkCore.Metadata;
|
||||||
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
|
||||||
|
@ -16,6 +17,7 @@ namespace ShardingCore.Core.EntityMetadatas
|
||||||
public class DefaultEntityMetadataManager : IEntityMetadataManager
|
public class DefaultEntityMetadataManager : IEntityMetadataManager
|
||||||
{
|
{
|
||||||
private readonly ConcurrentDictionary<Type, EntityMetadata> _caches = new();
|
private readonly ConcurrentDictionary<Type, EntityMetadata> _caches = new();
|
||||||
|
private readonly ConcurrentDictionary<string/*logic table name*/, EntityMetadata> _logicTableCaches = new();
|
||||||
|
|
||||||
public bool AddEntityMetadata(EntityMetadata entityMetadata)
|
public bool AddEntityMetadata(EntityMetadata entityMetadata)
|
||||||
{
|
{
|
||||||
|
@ -70,7 +72,11 @@ namespace ShardingCore.Core.EntityMetadatas
|
||||||
|
|
||||||
public EntityMetadata TryGetByLogicTableName(string logicTableName)
|
public EntityMetadata TryGetByLogicTableName(string logicTableName)
|
||||||
{
|
{
|
||||||
return _caches.Values.FirstOrDefault(o => o.LogicTableName == logicTableName);
|
if (_logicTableCaches.TryGetValue(logicTableName, out var metadata))
|
||||||
|
{
|
||||||
|
return metadata;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -99,6 +105,16 @@ namespace ShardingCore.Core.EntityMetadatas
|
||||||
if (_caches.TryGetValue(efEntityType.ClrType, out var metadata))
|
if (_caches.TryGetValue(efEntityType.ClrType, out var metadata))
|
||||||
{
|
{
|
||||||
metadata.SetEntityModel(efEntityType);
|
metadata.SetEntityModel(efEntityType);
|
||||||
|
if (string.IsNullOrWhiteSpace(metadata.LogicTableName))
|
||||||
|
{
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"init model error, cant get logic table name:[{metadata.LogicTableName}] from entity:[{efEntityType.ClrType}]");
|
||||||
|
}
|
||||||
|
if (!_logicTableCaches.TryAdd(metadata.LogicTableName, metadata))
|
||||||
|
{
|
||||||
|
throw new ShardingCoreInvalidOperationException(
|
||||||
|
$"cant add logic table name caches for metadata:[{metadata.LogicTableName}-{efEntityType.ClrType}]");
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,6 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
void CheckRequirement();
|
void CheckRequirement();
|
||||||
|
|
||||||
void GetOrCreateShardingRuntimeModel(DbContext dbContext);
|
void GetOrCreateShardingRuntimeModel(DbContext dbContext);
|
||||||
|
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void AutoShardingCreate();
|
void AutoShardingCreate();
|
||||||
object GetService(Type serviceType);
|
object GetService(Type serviceType);
|
||||||
|
|
|
@ -19,7 +19,7 @@ using ShardingCore.Core.VirtualRoutes.Abstractions;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
|
||||||
using ShardingCore.DynamicDataSources;
|
using ShardingCore.DynamicDataSources;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Sharding.ParallelTables;
|
using ShardingCore.Sharding.ParallelTables;
|
||||||
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
|
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
|
||||||
|
@ -254,12 +254,6 @@ namespace ShardingCore.Core.RuntimeContexts
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// public void UseLogfactory(ILoggerFactory loggerFactory)
|
|
||||||
// {
|
|
||||||
// // ShardingLoggerFactory.DefaultFactory = loggerFactory;
|
|
||||||
// _applicationLoggerFactory = loggerFactory;
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
private void CheckIfBuild()
|
private void CheckIfBuild()
|
||||||
|
|
|
@ -8,7 +8,6 @@ namespace ShardingCore.Core.ServiceProviders
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IShardingProvider
|
public interface IShardingProvider
|
||||||
{
|
{
|
||||||
void UseApplicationServiceProvider(IServiceProvider applicationServiceProvider);
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 优先通过ShardingCore的IServiceProvider获取
|
/// 优先通过ShardingCore的IServiceProvider获取
|
||||||
/// 没有再通过ApplicationServiceProvider获取
|
/// 没有再通过ApplicationServiceProvider获取
|
||||||
|
|
|
@ -15,11 +15,6 @@ namespace ShardingCore.Core.ServiceProviders
|
||||||
_applicationServiceProvider = applicationServiceProvider;
|
_applicationServiceProvider = applicationServiceProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UseApplicationServiceProvider(IServiceProvider applicationServiceProvider)
|
|
||||||
{
|
|
||||||
_applicationServiceProvider = applicationServiceProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public object GetService(Type serviceType,bool tryApplicationServiceProvider=true)
|
public object GetService(Type serviceType,bool tryApplicationServiceProvider=true)
|
||||||
{
|
{
|
||||||
var service = _internalServiceProvider?.GetService(serviceType);
|
var service = _internalServiceProvider?.GetService(serviceType);
|
||||||
|
|
|
@ -87,22 +87,12 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
|
||||||
|
|
||||||
public override void UseShellDbContextOptionBuilder(DbContextOptionsBuilder dbContextOptionsBuilder)
|
public override void UseShellDbContextOptionBuilder(DbContextOptionsBuilder dbContextOptionsBuilder)
|
||||||
{
|
{
|
||||||
if (_options.ShellDbContextConfigure == null)
|
_options.ShellDbContextConfigure?.Invoke(dbContextOptionsBuilder);
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_options.ShellDbContextConfigure.Invoke(dbContextOptionsBuilder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void UseExecutorDbContextOptionBuilder(DbContextOptionsBuilder dbContextOptionsBuilder)
|
public override void UseExecutorDbContextOptionBuilder(DbContextOptionsBuilder dbContextOptionsBuilder)
|
||||||
{
|
{
|
||||||
if (_options.ExecutorDbContextConfigure == null )
|
_options.ExecutorDbContextConfigure?.Invoke(dbContextOptionsBuilder);
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_options.ExecutorDbContextConfigure.Invoke(dbContextOptionsBuilder);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ using ShardingCore.Core.VirtualRoutes.Abstractions;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.TableExists.Abstractions;
|
using ShardingCore.TableExists.Abstractions;
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ using ShardingCore.Core.EntityMetadatas;
|
||||||
using ShardingCore.Core.RuntimeContexts;
|
using ShardingCore.Core.RuntimeContexts;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions;
|
||||||
using ShardingCore.Extensions.InternalExtensions;
|
using ShardingCore.Extensions.InternalExtensions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
using ShardingCore.Utils;
|
using ShardingCore.Utils;
|
||||||
|
|
||||||
|
|
|
@ -32,108 +32,59 @@ namespace ShardingCore.Helpers
|
||||||
[ExcludeFromCodeCoverage]
|
[ExcludeFromCodeCoverage]
|
||||||
public class MigrationHelper
|
public class MigrationHelper
|
||||||
{
|
{
|
||||||
private MigrationHelper() { }
|
private MigrationHelper()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
public static void Generate(
|
public static void Generate(
|
||||||
IShardingRuntimeContext shardingRuntimeContext,
|
IShardingRuntimeContext shardingRuntimeContext,
|
||||||
MigrationOperation operation,
|
MigrationOperation operation,
|
||||||
MigrationCommandListBuilder builder,
|
MigrationCommandListBuilder builder,
|
||||||
ISqlGenerationHelper sqlGenerationHelper,
|
ISqlGenerationHelper sqlGenerationHelper,
|
||||||
List<MigrationCommand> addCmds
|
List<MigrationCommand> addCmds
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
var migrationCommands = (List<MigrationCommand>) builder.GetFieldValue("_commands");
|
var migrationCommands = (List<MigrationCommand>)builder.GetFieldValue("_commands");
|
||||||
var shardingMigrationManager = shardingRuntimeContext.GetRequiredService<IShardingMigrationManager>();
|
var shardingMigrationManager = shardingRuntimeContext.GetRequiredService<IShardingMigrationManager>();
|
||||||
var virtualDataSource = shardingRuntimeContext.GetRequiredService<IVirtualDataSource>();
|
var virtualDataSource = shardingRuntimeContext.GetRequiredService<IVirtualDataSource>();
|
||||||
var currentCurrentDataSourceName = shardingMigrationManager.Current?.CurrentDataSourceName??virtualDataSource.DefaultDataSourceName;
|
var currentCurrentDataSourceName = shardingMigrationManager.Current?.CurrentDataSourceName ??
|
||||||
|
virtualDataSource.DefaultDataSourceName;
|
||||||
|
|
||||||
addCmds.ForEach(aAddCmd =>
|
addCmds.ForEach(aAddCmd =>
|
||||||
|
{
|
||||||
|
var (migrationResult, shardingCmds) = BuildDataSourceShardingCmds(shardingRuntimeContext,
|
||||||
|
virtualDataSource.DefaultDataSourceName, currentCurrentDataSourceName, operation,
|
||||||
|
aAddCmd.CommandText, sqlGenerationHelper);
|
||||||
|
if (!migrationResult.InDataSource)
|
||||||
{
|
{
|
||||||
var (migrationResult,shardingCmds) = BuildDataSourceShardingCmds(shardingRuntimeContext,virtualDataSource.DefaultDataSourceName,currentCurrentDataSourceName,operation, aAddCmd.CommandText, sqlGenerationHelper);
|
if (migrationResult.CommandType == MigrationCommandTypeEnum.TableCommand)
|
||||||
if (!migrationResult.InDataSource)
|
|
||||||
{
|
{
|
||||||
if (migrationResult.CommandType == MigrationCommandTypeEnum.TableCommand)
|
migrationCommands.Remove(aAddCmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (migrationResult.CommandType == MigrationCommandTypeEnum.TableCommand)
|
||||||
|
{
|
||||||
|
//如果是分表
|
||||||
|
if (shardingCmds.IsNotEmpty())
|
||||||
{
|
{
|
||||||
migrationCommands.Remove(aAddCmd);
|
migrationCommands.Remove(aAddCmd);
|
||||||
}
|
//针对builder的原始表进行移除
|
||||||
}
|
shardingCmds.ForEach(aShardingCmd =>
|
||||||
else
|
|
||||||
{
|
|
||||||
if (migrationResult.CommandType == MigrationCommandTypeEnum.TableCommand)
|
|
||||||
{
|
|
||||||
//如果是分表
|
|
||||||
if (shardingCmds.IsNotEmpty())
|
|
||||||
{
|
{
|
||||||
migrationCommands.Remove(aAddCmd);
|
builder.Append(aShardingCmd)
|
||||||
//针对builder的原始表进行移除
|
.EndCommand();
|
||||||
shardingCmds.ForEach(aShardingCmd =>
|
});
|
||||||
{
|
|
||||||
builder.Append(aShardingCmd)
|
|
||||||
.EndCommand();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<string> BuildShardingCmds(IShardingRuntimeContext shardingRuntimeContext,MigrationOperation operation, string sourceCmd, ISqlGenerationHelper sqlGenerationHelper)
|
private static (MigrationResult migrationResult, List<string>) BuildDataSourceShardingCmds(
|
||||||
{
|
IShardingRuntimeContext shardingRuntimeContext, string defaultDataSourceName, string dataSourceName,
|
||||||
//所有MigrationOperation定义
|
MigrationOperation operation, string sourceCmd, ISqlGenerationHelper sqlGenerationHelper)
|
||||||
//https://github.com/dotnet/efcore/tree/b970bf29a46521f40862a01db9e276e6448d3cb0/src/EFCore.Relational/Migrations/Operations
|
|
||||||
//ColumnOperation仅替换Table
|
|
||||||
//其余其余都是将Name和Table使用分表名替换
|
|
||||||
var tableRouteManager = shardingRuntimeContext.GetTableRouteManager();
|
|
||||||
var tableRoutes = tableRouteManager.GetRoutes();
|
|
||||||
var existsShardingTables = tableRoutes.ToDictionary(o => o.EntityMetadata.LogicTableName, o => o.GetTails().Select(p=>$"{o.EntityMetadata.LogicTableName}{o.EntityMetadata.TableSeparator}{p}").ToList());
|
|
||||||
//Dictionary<string, List<string>> _existsShardingTables
|
|
||||||
// = Cache.ServiceProvider.GetService<ShardingContainer>().ExistsShardingTables;
|
|
||||||
List<string> resList = new List<string>();
|
|
||||||
string absTableName = string.Empty;
|
|
||||||
|
|
||||||
string name = operation.GetPropertyValue("Name") as string;
|
|
||||||
string tableName = operation.GetPropertyValue("Table") as string;
|
|
||||||
string pattern = string.Format("^({0})$|^({0}_.*?)$|^(.*?_{0}_.*?)$|^(.*?_{0})$", absTableName);
|
|
||||||
Func<KeyValuePair<string, List<string>>, bool> where = x =>
|
|
||||||
existsShardingTables.Any(y =>x.Key==y.Key&& Regex.IsMatch(name, BuildPattern(y.Key)));
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(tableName))
|
|
||||||
{
|
|
||||||
absTableName = tableName;
|
|
||||||
}
|
|
||||||
else if (!string.IsNullOrWhiteSpace(name) && existsShardingTables.Any(x => where(x)))
|
|
||||||
{
|
|
||||||
absTableName = existsShardingTables.Where(x => where(x)).FirstOrDefault().Key;
|
|
||||||
}
|
|
||||||
|
|
||||||
//分表
|
|
||||||
if (!string.IsNullOrWhiteSpace(absTableName) && existsShardingTables.ContainsKey(absTableName))
|
|
||||||
{
|
|
||||||
var shardings = existsShardingTables[absTableName];
|
|
||||||
shardings.ForEach(aShardingTable =>
|
|
||||||
{
|
|
||||||
string newCmd = sourceCmd;
|
|
||||||
GetReplaceGroups(operation, absTableName, aShardingTable).ForEach(aReplace =>
|
|
||||||
{
|
|
||||||
newCmd = newCmd.Replace(
|
|
||||||
sqlGenerationHelper.DelimitIdentifier(aReplace.sourceName),
|
|
||||||
sqlGenerationHelper.DelimitIdentifier(aReplace.targetName));
|
|
||||||
});
|
|
||||||
if (newCmd.Contains("EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE'"))
|
|
||||||
{
|
|
||||||
newCmd=newCmd.Replace($"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE', N'{absTableName}'", $"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE', N'{aShardingTable}'");
|
|
||||||
}
|
|
||||||
resList.Add(newCmd);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return resList;
|
|
||||||
|
|
||||||
string BuildPattern(string absTableName)
|
|
||||||
{
|
|
||||||
return string.Format("^({0})$|^({0}_.*?)$|^(.*?_{0}_.*?)$|^(.*?_{0})$", absTableName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private static (MigrationResult migrationResult,List<string>) BuildDataSourceShardingCmds(IShardingRuntimeContext shardingRuntimeContext,string defaultDataSourceName,string dataSourceName,MigrationOperation operation, string sourceCmd, ISqlGenerationHelper sqlGenerationHelper)
|
|
||||||
{
|
{
|
||||||
//所有MigrationOperation定义
|
//所有MigrationOperation定义
|
||||||
//https://github.com/dotnet/efcore/tree/b970bf29a46521f40862a01db9e276e6448d3cb0/src/EFCore.Relational/Migrations/Operations
|
//https://github.com/dotnet/efcore/tree/b970bf29a46521f40862a01db9e276e6448d3cb0/src/EFCore.Relational/Migrations/Operations
|
||||||
|
@ -143,7 +94,9 @@ namespace ShardingCore.Helpers
|
||||||
var entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager();
|
var entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager();
|
||||||
var tableRouteManager = shardingRuntimeContext.GetTableRouteManager();
|
var tableRouteManager = shardingRuntimeContext.GetTableRouteManager();
|
||||||
var tableRoutes = tableRouteManager.GetRoutes();
|
var tableRoutes = tableRouteManager.GetRoutes();
|
||||||
var existsShardingTables = tableRoutes.ToDictionary(o => o.EntityMetadata.LogicTableName, o => o.GetTails().Select(p=>$"{o.EntityMetadata.LogicTableName}{o.EntityMetadata.TableSeparator}{p}").ToList());
|
var existsShardingTables = tableRoutes.ToDictionary(o => o.EntityMetadata.LogicTableName,
|
||||||
|
o => o.GetTails().Select(p => $"{o.EntityMetadata.LogicTableName}{o.EntityMetadata.TableSeparator}{p}")
|
||||||
|
.ToList());
|
||||||
//Dictionary<string, List<string>> _existsShardingTables
|
//Dictionary<string, List<string>> _existsShardingTables
|
||||||
// = Cache.ServiceProvider.GetService<ShardingContainer>().ExistsShardingTables;
|
// = Cache.ServiceProvider.GetService<ShardingContainer>().ExistsShardingTables;
|
||||||
List<string> resList = new List<string>();
|
List<string> resList = new List<string>();
|
||||||
|
@ -153,7 +106,7 @@ namespace ShardingCore.Helpers
|
||||||
string tableName = operation.GetPropertyValue("Table") as string;
|
string tableName = operation.GetPropertyValue("Table") as string;
|
||||||
string pattern = string.Format("^({0})$|^({0}_.*?)$|^(.*?_{0}_.*?)$|^(.*?_{0})$", absTableName);
|
string pattern = string.Format("^({0})$|^({0}_.*?)$|^(.*?_{0}_.*?)$|^(.*?_{0})$", absTableName);
|
||||||
Func<KeyValuePair<string, List<string>>, bool> where = x =>
|
Func<KeyValuePair<string, List<string>>, bool> where = x =>
|
||||||
existsShardingTables.Any(y =>x.Key==y.Key&& Regex.IsMatch(name, BuildPattern(y.Key)));
|
existsShardingTables.Any(y => x.Key == y.Key && Regex.IsMatch(name, BuildPattern(y.Key)));
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(tableName))
|
if (!string.IsNullOrWhiteSpace(tableName))
|
||||||
{
|
{
|
||||||
|
@ -163,7 +116,7 @@ namespace ShardingCore.Helpers
|
||||||
{
|
{
|
||||||
if (existsShardingTables.Any(x => where(x)))
|
if (existsShardingTables.Any(x => where(x)))
|
||||||
{
|
{
|
||||||
absTableName = existsShardingTables.Where(x => where(x)).FirstOrDefault().Key;
|
absTableName = existsShardingTables.FirstOrDefault(x => where(x)).Key;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -178,7 +131,7 @@ namespace ShardingCore.Helpers
|
||||||
migrationResult.CommandType = MigrationCommandTypeEnum.TableCommand;
|
migrationResult.CommandType = MigrationCommandTypeEnum.TableCommand;
|
||||||
|
|
||||||
|
|
||||||
bool isShardingDataSource =entityMetadata.IsShardingDataSource();
|
bool isShardingDataSource = entityMetadata.IsShardingDataSource();
|
||||||
if (isShardingDataSource)
|
if (isShardingDataSource)
|
||||||
{
|
{
|
||||||
var virtualDataSourceRoute = dataSourceRouteManager.GetRoute(entityMetadata.EntityType);
|
var virtualDataSourceRoute = dataSourceRouteManager.GetRoute(entityMetadata.EntityType);
|
||||||
|
@ -190,19 +143,18 @@ namespace ShardingCore.Helpers
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
migrationResult.InDataSource = false;
|
migrationResult.InDataSource = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
migrationResult.InDataSource = defaultDataSourceName==dataSourceName;
|
migrationResult.InDataSource = defaultDataSourceName == dataSourceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
//分表
|
//分表
|
||||||
if (migrationResult.InDataSource&&!string.IsNullOrWhiteSpace(absTableName) && existsShardingTables.ContainsKey(absTableName))
|
if (migrationResult.InDataSource && !string.IsNullOrWhiteSpace(absTableName) &&
|
||||||
|
existsShardingTables.ContainsKey(absTableName))
|
||||||
{
|
{
|
||||||
|
|
||||||
var shardings = existsShardingTables[absTableName];
|
var shardings = existsShardingTables[absTableName];
|
||||||
shardings.ForEach(aShardingTable =>
|
shardings.ForEach(aShardingTable =>
|
||||||
{
|
{
|
||||||
|
@ -213,22 +165,27 @@ namespace ShardingCore.Helpers
|
||||||
sqlGenerationHelper.DelimitIdentifier(aReplace.sourceName),
|
sqlGenerationHelper.DelimitIdentifier(aReplace.sourceName),
|
||||||
sqlGenerationHelper.DelimitIdentifier(aReplace.targetName));
|
sqlGenerationHelper.DelimitIdentifier(aReplace.targetName));
|
||||||
});
|
});
|
||||||
if (newCmd.Contains("EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE'"))
|
if (newCmd.Contains(
|
||||||
|
"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE'"))
|
||||||
{
|
{
|
||||||
newCmd=newCmd.Replace($"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE', N'{absTableName}'", $"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE', N'{aShardingTable}'");
|
newCmd = newCmd.Replace(
|
||||||
|
$"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE', N'{absTableName}'",
|
||||||
|
$"EXEC sp_addextendedproperty 'MS_Description', @description, 'SCHEMA', @defaultSchema, 'TABLE', N'{aShardingTable}'");
|
||||||
}
|
}
|
||||||
|
|
||||||
resList.Add(newCmd);
|
resList.Add(newCmd);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (migrationResult,resList);
|
return (migrationResult, resList);
|
||||||
|
|
||||||
string BuildPattern(string absTableName)
|
string BuildPattern(string absTableName)
|
||||||
{
|
{
|
||||||
return string.Format("^({0})$|^({0}_.*?)$|^(.*?_{0}_.*?)$|^(.*?_{0})$", absTableName);
|
return string.Format("^({0})$|^({0}_.*?)$|^(.*?_{0}_.*?)$|^(.*?_{0})$", absTableName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<(string sourceName, string targetName)> GetReplaceGroups(
|
private static List<(string sourceName, string targetName)> GetReplaceGroups(
|
||||||
MigrationOperation operation, string sourceTableName, string targetTableName)
|
MigrationOperation operation, string sourceTableName, string targetTableName)
|
||||||
{
|
{
|
||||||
|
@ -243,7 +200,11 @@ namespace ShardingCore.Helpers
|
||||||
{
|
{
|
||||||
if (!(operation is ColumnOperation columnOperation))
|
if (!(operation is ColumnOperation columnOperation))
|
||||||
{
|
{
|
||||||
string[] patterns = new string[] { $"^()({sourceTableName})()$", $"^()({sourceTableName})(_.*?)$", $"^(.*?_)({sourceTableName})(_.*?)$", $"^(.*?_)({sourceTableName})()$" };
|
string[] patterns = new string[]
|
||||||
|
{
|
||||||
|
$"^()({sourceTableName})()$", $"^()({sourceTableName})(_.*?)$",
|
||||||
|
$"^(.*?_)({sourceTableName})(_.*?)$", $"^(.*?_)({sourceTableName})()$"
|
||||||
|
};
|
||||||
foreach (var aPattern in patterns)
|
foreach (var aPattern in patterns)
|
||||||
{
|
{
|
||||||
if (Regex.IsMatch(name, aPattern))
|
if (Regex.IsMatch(name, aPattern))
|
||||||
|
@ -255,6 +216,7 @@ namespace ShardingCore.Helpers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Func<PropertyInfo, bool> listPropertyWhere = x =>
|
Func<PropertyInfo, bool> listPropertyWhere = x =>
|
||||||
x.PropertyType.IsGenericType
|
x.PropertyType.IsGenericType
|
||||||
&& x.PropertyType.GetGenericTypeDefinition() == typeof(List<>)
|
&& x.PropertyType.GetGenericTypeDefinition() == typeof(List<>)
|
||||||
|
@ -280,7 +242,8 @@ namespace ShardingCore.Helpers
|
||||||
{
|
{
|
||||||
foreach (var aValue in (IEnumerable)propertyValue)
|
foreach (var aValue in (IEnumerable)propertyValue)
|
||||||
{
|
{
|
||||||
resList.AddRange(GetReplaceGroups((MigrationOperation)aValue, sourceTableName, targetTableName));
|
resList.AddRange(GetReplaceGroups((MigrationOperation)aValue, sourceTableName,
|
||||||
|
targetTableName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
//using System;
|
|
||||||
//using System.Collections.Generic;
|
|
||||||
//using System.Data.Common;
|
|
||||||
//using System.Text;
|
|
||||||
//using Microsoft.EntityFrameworkCore;
|
|
||||||
//using ShardingCore.Sharding.Abstractions;
|
|
||||||
|
|
||||||
///*
|
|
||||||
//* @Author: xjm
|
|
||||||
//* @Description:
|
|
||||||
//* @Date: 2021/8/20 11:34:55
|
|
||||||
//* @Ver: 1.0
|
|
||||||
//* @Email: 326308290@qq.com
|
|
||||||
//*/
|
|
||||||
//namespace ShardingCore
|
|
||||||
//{
|
|
||||||
// /// <summary>
|
|
||||||
// /// 分片db context配置构造配置
|
|
||||||
// /// </summary>
|
|
||||||
// /// <typeparam name="TShardingDbContext"></typeparam>
|
|
||||||
// public interface IShardingDbContextOptionsBuilderConfig<TShardingDbContext> where TShardingDbContext:DbContext,IShardingDbContext
|
|
||||||
// {
|
|
||||||
// /// <summary>
|
|
||||||
// /// 如何根据connectionString 配置 DbContextOptionsBuilder
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="connectionString"></param>
|
|
||||||
// /// <param name="dbContextOptionsBuilder"></param>
|
|
||||||
// /// <returns></returns>
|
|
||||||
// DbContextOptionsBuilder UseDbContextOptionsBuilder(string connectionString, DbContextOptionsBuilder dbContextOptionsBuilder);
|
|
||||||
// /// <summary>
|
|
||||||
// /// 如何根据dbConnection 配置DbContextOptionsBuilder
|
|
||||||
// /// </summary>
|
|
||||||
// /// <param name="dbConnection"></param>
|
|
||||||
// /// <param name="dbContextOptionsBuilder"></param>
|
|
||||||
// /// <returns></returns>
|
|
||||||
// DbContextOptionsBuilder UseDbContextOptionsBuilder(DbConnection dbConnection, DbContextOptionsBuilder dbContextOptionsBuilder);
|
|
||||||
// }
|
|
||||||
//}
|
|
|
@ -6,7 +6,7 @@ using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ShardingCore.Logger;
|
|
||||||
|
|
||||||
namespace ShardingCore.Jobs
|
namespace ShardingCore.Jobs
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,52 +1,52 @@
|
||||||
using System;
|
// using System;
|
||||||
using System.Collections.Generic;
|
// using System.Collections.Generic;
|
||||||
using System.Diagnostics.Contracts;
|
// using System.Diagnostics.Contracts;
|
||||||
using System.Text;
|
// using System.Text;
|
||||||
using System.Threading;
|
// using System.Threading;
|
||||||
using Microsoft.Extensions.Logging;
|
// using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Logging.Abstractions;
|
// using Microsoft.Extensions.Logging.Abstractions;
|
||||||
|
//
|
||||||
namespace ShardingCore.Logger
|
// namespace ShardingCore.Logger
|
||||||
{
|
// {
|
||||||
/// <summary>
|
// /// <summary>
|
||||||
///
|
// ///
|
||||||
/// </summary>
|
// /// </summary>
|
||||||
/// Author: xjm
|
// /// Author: xjm
|
||||||
/// Created: 2022/5/18 10:02:25
|
// /// Created: 2022/5/18 10:02:25
|
||||||
/// Email: 326308290@qq.com
|
// /// Email: 326308290@qq.com
|
||||||
public sealed class ShardingLoggerFactory
|
// public sealed class ShardingLoggerFactory
|
||||||
{
|
// {
|
||||||
static ILoggerFactory _defaultFactory;
|
// static ILoggerFactory _defaultFactory;
|
||||||
|
//
|
||||||
|
//
|
||||||
static ILoggerFactory NewDefaultFactory()
|
// static ILoggerFactory NewDefaultFactory()
|
||||||
{
|
// {
|
||||||
var f = new NullLoggerFactory();
|
// var f = new NullLoggerFactory();
|
||||||
return f;
|
// return f;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
/// <summary>
|
// /// <summary>
|
||||||
/// Gets or sets the default factory.
|
// /// Gets or sets the default factory.
|
||||||
/// </summary>
|
// /// </summary>
|
||||||
public static ILoggerFactory DefaultFactory
|
// public static ILoggerFactory DefaultFactory
|
||||||
{
|
// {
|
||||||
get
|
// get
|
||||||
{
|
// {
|
||||||
ILoggerFactory factory = Volatile.Read(ref _defaultFactory);
|
// ILoggerFactory factory = Volatile.Read(ref _defaultFactory);
|
||||||
if (factory == null)
|
// if (factory == null)
|
||||||
{
|
// {
|
||||||
factory = NewDefaultFactory();
|
// factory = NewDefaultFactory();
|
||||||
ILoggerFactory current = Interlocked.CompareExchange(ref _defaultFactory, factory, null);
|
// ILoggerFactory current = Interlocked.CompareExchange(ref _defaultFactory, factory, null);
|
||||||
if (current != null)
|
// if (current != null)
|
||||||
{
|
// {
|
||||||
return current;
|
// return current;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
return factory;
|
// return factory;
|
||||||
}
|
// }
|
||||||
set => Volatile.Write(ref _defaultFactory, value);
|
// set => Volatile.Write(ref _defaultFactory, value);
|
||||||
}
|
// }
|
||||||
public static ILogger<T> CreateLogger<T>() => DefaultFactory.CreateLogger<T>();
|
// public static ILogger<T> CreateLogger<T>() => DefaultFactory.CreateLogger<T>();
|
||||||
public static ILogger CreateLogger(string categoryName) => DefaultFactory.CreateLogger(categoryName);
|
// public static ILogger CreateLogger(string categoryName) => DefaultFactory.CreateLogger(categoryName);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
|
@ -18,7 +18,7 @@ using ShardingCore.Core.RuntimeContexts;
|
||||||
using ShardingCore.Exceptions;
|
using ShardingCore.Exceptions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Infrastructures;
|
using ShardingCore.Infrastructures;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Abstractions;
|
using ShardingCore.Sharding.Abstractions;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
namespace ShardingCore.Sharding.ShardingDbContextExecutors
|
||||||
|
|
|
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
using ShardingCore.Core.QueryRouteManagers.Abstractions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Parsers.Abstractions;
|
using ShardingCore.Sharding.Parsers.Abstractions;
|
||||||
using ShardingCore.Sharding.ShardingExecutors.Abstractions;
|
using ShardingCore.Sharding.ShardingExecutors.Abstractions;
|
||||||
using ShardingCore.Sharding.Visitors.ShardingExtractParameters;
|
using ShardingCore.Sharding.Visitors.ShardingExtractParameters;
|
||||||
|
|
|
@ -14,7 +14,7 @@ using System.Threading.Tasks;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using ShardingCore.Core;
|
using ShardingCore.Core;
|
||||||
using ShardingCore.Extensions.InternalExtensions;
|
using ShardingCore.Extensions.InternalExtensions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.MergeEngines;
|
using ShardingCore.Sharding.MergeEngines;
|
||||||
#if EFCORE2
|
#if EFCORE2
|
||||||
using Microsoft.EntityFrameworkCore.Internal;
|
using Microsoft.EntityFrameworkCore.Internal;
|
||||||
|
|
|
@ -11,7 +11,7 @@ using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using ShardingCore.Core;
|
using ShardingCore.Core;
|
||||||
using ShardingCore.Extensions.InternalExtensions;
|
using ShardingCore.Extensions.InternalExtensions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding.Parsers.Abstractions;
|
using ShardingCore.Sharding.Parsers.Abstractions;
|
||||||
|
|
||||||
namespace ShardingCore.Sharding.ShardingExecutors
|
namespace ShardingCore.Sharding.ShardingExecutors
|
||||||
|
|
|
@ -70,6 +70,7 @@ namespace ShardingCore
|
||||||
{
|
{
|
||||||
return Build(appServiceProvider, appServiceProvider?.GetService<ILoggerFactory>());
|
return Build(appServiceProvider, appServiceProvider?.GetService<ILoggerFactory>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public IShardingRuntimeContext Build(IServiceProvider appServiceProvider, ILoggerFactory loggerFactory)
|
public IShardingRuntimeContext Build(IServiceProvider appServiceProvider, ILoggerFactory loggerFactory)
|
||||||
{
|
{
|
||||||
var shardingRuntimeContext = new ShardingRuntimeContext();
|
var shardingRuntimeContext = new ShardingRuntimeContext();
|
||||||
|
|
|
@ -13,7 +13,6 @@ using System.Threading;
|
||||||
using ShardingCore.Core.DbContextCreator;
|
using ShardingCore.Core.DbContextCreator;
|
||||||
using ShardingCore.Core.ServiceProviders;
|
using ShardingCore.Core.ServiceProviders;
|
||||||
using ShardingCore.Core.ShardingConfigurations;
|
using ShardingCore.Core.ShardingConfigurations;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.Sharding;
|
using ShardingCore.Sharding;
|
||||||
|
|
||||||
namespace ShardingCore.TableCreator
|
namespace ShardingCore.TableCreator
|
||||||
|
|
|
@ -17,7 +17,7 @@ using ShardingCore.Core.VirtualRoutes.Abstractions;
|
||||||
using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions;
|
using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions;
|
||||||
using ShardingCore.Extensions;
|
using ShardingCore.Extensions;
|
||||||
using ShardingCore.Jobs.Abstaractions;
|
using ShardingCore.Jobs.Abstaractions;
|
||||||
using ShardingCore.Logger;
|
|
||||||
using ShardingCore.TableCreator;
|
using ShardingCore.TableCreator;
|
||||||
|
|
||||||
namespace ShardingCore.VirtualRoutes.Abstractions
|
namespace ShardingCore.VirtualRoutes.Abstractions
|
||||||
|
|
Loading…
Reference in New Issue