添加动态数据源选择性创建库和表,发布x.5.0.13

This commit is contained in:
xuejiaming 2022-06-24 15:03:29 +08:00
parent e68234c8cc
commit 9ac4e5a942
4 changed files with 24 additions and 16 deletions

View File

@ -1,9 +1,9 @@
:start
::定义版本
set EFCORE2=2.5.0.12
set EFCORE3=3.5.0.12
set EFCORE5=5.5.0.12
set EFCORE6=6.5.0.12
set EFCORE2=2.5.0.13
set EFCORE3=3.5.0.13
set EFCORE5=5.5.0.13
set EFCORE6=6.5.0.13
::删除所有bin与obj下的文件
@echo off

View File

@ -49,7 +49,7 @@ namespace ShardingCore.DynamicDataSources
}
public void InitConfigure(IVirtualDataSource<TShardingDbContext> virtualDataSource, string dataSourceName,
string connectionString, bool isOnStart)
string connectionString, bool isOnStart, bool? needCreateDatabase=null, bool? needCreateTable = null)
{
using (var serviceScope = ShardingContainer.ServiceProvider.CreateScope())
{
@ -57,9 +57,11 @@ namespace ShardingCore.DynamicDataSources
{
using (var context = serviceScope.ServiceProvider.GetService<TShardingDbContext>())
{
if (_entityConfigOptions.EnsureCreatedWithOutShardingTable || !isOnStart)
var createDatabase = !needCreateDatabase.HasValue || needCreateDatabase.Value;
if ((_entityConfigOptions.EnsureCreatedWithOutShardingTable || !isOnStart)&&createDatabase)
EnsureCreated(virtualDataSource, context, dataSourceName);
else if (_entityConfigOptions.CreateDataBaseOnlyOnStart.GetValueOrDefault())
else if (_entityConfigOptions.CreateDataBaseOnlyOnStart.GetValueOrDefault()&& createDatabase)
{
EnsureCreateDataBaseOnly(context, dataSourceName);
}
@ -77,7 +79,7 @@ namespace ShardingCore.DynamicDataSources
{
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
//创建表
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart);
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart, needCreateTable);
}
}
else
@ -91,7 +93,7 @@ namespace ShardingCore.DynamicDataSources
{
var virtualTable = _virtualTableManager.GetVirtualTable(entityType);
//创建表
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart);
CreateDataTable(dataSourceName, virtualTable, existTables, isOnStart,needCreateTable);
}
}
}
@ -103,13 +105,13 @@ namespace ShardingCore.DynamicDataSources
}
private void CreateDataTable(string dataSourceName, IVirtualTable virtualTable, ISet<string> existTables,
bool isOnStart)
bool isOnStart,bool? needCreateTable)
{
var entityMetadata = virtualTable.EntityMetadata;
foreach (var tail in virtualTable.GetVirtualRoute().GetAllTails())
{
var defaultPhysicTable = new DefaultPhysicTable(virtualTable, tail);
if (NeedCreateTable(entityMetadata) || !isOnStart)
if ((NeedCreateTable(entityMetadata) || !isOnStart)&&(!needCreateTable.HasValue|| needCreateTable.Value))
{
try
{

View File

@ -18,6 +18,8 @@ namespace ShardingCore.DynamicDataSources
/// <param name="dataSourceName"></param>
/// <param name="connectionString"></param>
/// <param name="isOnStart">当前是否是启动时被调用</param>
void InitConfigure(IVirtualDataSource<TShardingDbContext> virtualDataSource,string dataSourceName, string connectionString,bool isOnStart);
/// <param name="needCreateDatabase">当前是否是启动时被调用</param>
/// <param name="needCreateTable">当前是否是启动时被调用</param>
void InitConfigure(IVirtualDataSource<TShardingDbContext> virtualDataSource, string dataSourceName, string connectionString, bool isOnStart, bool? needCreateDatabase = null, bool? needCreateTable = null);
}
}

View File

@ -55,11 +55,13 @@ namespace ShardingCore.Helpers
/// <param name="virtualDataSource"></param>
/// <param name="dataSourceName"></param>
/// <param name="connectionString"></param>
public static void DynamicAppendDataSource<TShardingDbContext>(IVirtualDataSource<TShardingDbContext> virtualDataSource, string dataSourceName, string connectionString) where TShardingDbContext : DbContext, IShardingDbContext
/// <param name="createDatabase"></param>
/// <param name="createTable"></param>
public static void DynamicAppendDataSource<TShardingDbContext>(IVirtualDataSource<TShardingDbContext> virtualDataSource, string dataSourceName, string connectionString,bool? createDatabase=null,bool? createTable=null) where TShardingDbContext : DbContext, IShardingDbContext
{
var defaultDataSourceInitializer = ShardingContainer.GetService<IDataSourceInitializer<TShardingDbContext>>();
virtualDataSource.AddPhysicDataSource(new DefaultPhysicDataSource(dataSourceName, connectionString, false));
defaultDataSourceInitializer.InitConfigure(virtualDataSource, dataSourceName, connectionString, false);
defaultDataSourceInitializer.InitConfigure(virtualDataSource, dataSourceName, connectionString, false,createDatabase,createTable);
}
/// <summary>
/// 动态添加数据源
@ -68,14 +70,16 @@ namespace ShardingCore.Helpers
/// <param name="configId"></param>
/// <param name="dataSourceName"></param>
/// <param name="connectionString"></param>
public static void DynamicAppendDataSource<TShardingDbContext>(string configId, string dataSourceName, string connectionString) where TShardingDbContext : DbContext, IShardingDbContext
/// <param name="createDatabase"></param>
/// <param name="createTable"></param>
public static void DynamicAppendDataSource<TShardingDbContext>(string configId, string dataSourceName, string connectionString, bool? createDatabase = null, bool? createTable = null) where TShardingDbContext : DbContext, IShardingDbContext
{
var defaultDataSourceInitializer = ShardingContainer.GetService<IDataSourceInitializer<TShardingDbContext>>();
var virtualDataSourceManager = ShardingContainer.GetService<IVirtualDataSourceManager<TShardingDbContext>>();
var virtualDataSource = virtualDataSourceManager.GetVirtualDataSource(configId);
virtualDataSource.AddPhysicDataSource(new DefaultPhysicDataSource(dataSourceName, connectionString, false));
defaultDataSourceInitializer.InitConfigure(virtualDataSource, dataSourceName, connectionString, false);
defaultDataSourceInitializer.InitConfigure(virtualDataSource, dataSourceName, connectionString, false, createDatabase, createTable);
}
/// <summary>