Skip to content

Commit 65dbc3b

Browse files
committed
修复逻辑表对应的对象如果是分片对象只能有一个普通对象可以有多个 发布x.6.0.10
1 parent cee1251 commit 65dbc3b

File tree

4 files changed

+28
-16
lines changed

4 files changed

+28
-16
lines changed

samples/Sample.SqlServer/UnionAllMerge/UnionAllMergeSqlServerQuerySqlGeneratorFactory.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,24 @@ private Expression OverrideVisitTable(TableExpression tableExpression)
6060
{
6161
if (_unionAllMergeManager?.Current != null)
6262
{
63-
var entityMetadata = _entityMetadataManager.TryGetByLogicTableName(tableExpression.Name);
63+
var entityMetadatas = _entityMetadataManager.TryGetByLogicTableName(tableExpression.Name);
6464
var tableRouteResults = _unionAllMergeManager?.Current.TableRoutesResults.ToArray();
65-
if (tableRouteResults.IsNotEmpty() &&entityMetadata!=null&&
66-
tableRouteResults[0].ReplaceTables.Any(o =>o.EntityType==entityMetadata.EntityType));
65+
if (tableRouteResults.IsNotEmpty() &&
66+
entityMetadatas.IsNotEmpty()&&
67+
entityMetadatas.Count==1&&
68+
tableRouteResults[0].ReplaceTables.Any(o =>o.EntityType==entityMetadatas[0].EntityType));
6769
{
68-
var tails = tableRouteResults.Select(o => o.ReplaceTables.FirstOrDefault(r => r.EntityType==entityMetadata.EntityType)?.Tail).ToHashSet();
70+
var tails = tableRouteResults.Select(o => o.ReplaceTables.FirstOrDefault(r => r.EntityType==entityMetadatas[0].EntityType)?.Tail).ToHashSet();
6971

7072
var sqlGenerationHelper = typeof(QuerySqlGenerator).GetTypeFieldValue(this, "_sqlGenerationHelper") as ISqlGenerationHelper;
7173
string newTableName = null;
7274
if (tails.Count == 1)
7375
{
74-
newTableName = sqlGenerationHelper.DelimitIdentifier($"{tableExpression.Name}{entityMetadata.TableSeparator}{tails.First()}", tableExpression.Schema);
76+
newTableName = sqlGenerationHelper.DelimitIdentifier($"{tableExpression.Name}{entityMetadatas[0].TableSeparator}{tails.First()}", tableExpression.Schema);
7577
}
7678
else
7779
{
78-
newTableName = "(" + string.Join(" union all ", tails.Select(tail => $"select * from {sqlGenerationHelper.DelimitIdentifier($"{tableExpression.Name}{entityMetadata.TableSeparator}{tail}", tableExpression.Schema)}")) + ")";
80+
newTableName = "(" + string.Join(" union all ", tails.Select(tail => $"select * from {sqlGenerationHelper.DelimitIdentifier($"{tableExpression.Name}{entityMetadatas[0].TableSeparator}{tail}", tableExpression.Schema)}")) + ")";
7981
}
8082

8183
var relationalCommandBuilder = typeof(QuerySqlGenerator).GetTypeFieldValue(this, "_relationalCommandBuilder") as IRelationalCommandBuilder;

src/ShardingCore/Core/EntityMetadatas/DefaultEntityMetadataManager.cs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace ShardingCore.Core.EntityMetadatas
1717
public class DefaultEntityMetadataManager : IEntityMetadataManager
1818
{
1919
private readonly ConcurrentDictionary<Type, EntityMetadata> _caches = new();
20-
private readonly ConcurrentDictionary<string/*logic table name*/, EntityMetadata> _logicTableCaches = new();
20+
private readonly ConcurrentDictionary<string/*logic table name*/, List<EntityMetadata>> _logicTableCaches = new();
2121

2222
public bool AddEntityMetadata(EntityMetadata entityMetadata)
2323
{
@@ -70,7 +70,7 @@ public EntityMetadata TryGet(Type entityType)
7070
return entityMetadata;
7171
}
7272

73-
public EntityMetadata TryGetByLogicTableName(string logicTableName)
73+
public List<EntityMetadata> TryGetByLogicTableName(string logicTableName)
7474
{
7575
if (_logicTableCaches.TryGetValue(logicTableName, out var metadata))
7676
{
@@ -110,12 +110,23 @@ public bool TryInitModel(IEntityType efEntityType)
110110
throw new ShardingCoreInvalidOperationException(
111111
$"init model error, cant get logic table name:[{metadata.LogicTableName}] from entity:[{efEntityType.ClrType}]");
112112
}
113-
if (!_logicTableCaches.TryAdd(metadata.LogicTableName, metadata))
113+
if (!_logicTableCaches.TryGetValue(metadata.LogicTableName, out var metadatas))
114+
{
115+
metadatas = new List<EntityMetadata>();
116+
_logicTableCaches.TryAdd(metadata.LogicTableName, metadatas);
117+
}
118+
119+
if (metadatas.Any(o => o.EntityType != efEntityType.ClrType))
120+
{
121+
metadatas.Add(metadata);
122+
return true;
123+
}
124+
//添加完成后检查逻辑表对应的对象不可以存在两个以上的分片
125+
if (metadatas.Count > 1 && metadatas.Any(o => o.IsShardingTable() || o.IsShardingDataSource()))
114126
{
115127
throw new ShardingCoreInvalidOperationException(
116128
$"cant add logic table name caches for metadata:[{metadata.LogicTableName}-{efEntityType.ClrType}]");
117129
}
118-
return true;
119130
}
120131

121132
return false;

src/ShardingCore/Core/EntityMetadatas/IEntityMetadataManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public interface IEntityMetadataManager
3737
/// <param name="entityType"></param>
3838
/// <returns></returns>
3939
EntityMetadata? TryGet(Type entityType);
40-
EntityMetadata? TryGetByLogicTableName(string logicTableName);
40+
List<EntityMetadata> TryGetByLogicTableName(string logicTableName);
4141
/// <summary>
4242
/// 是否是分片对象(包括分表或者分库)
4343
/// </summary>

src/ShardingCore/Helpers/MigrationHelper.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,15 @@ private static (MigrationResult migrationResult, List<string>) BuildDataSourceSh
125125
}
126126

127127
MigrationResult migrationResult = new MigrationResult();
128-
var entityMetadata = entityMetadataManager.TryGetByLogicTableName(absTableName);
129-
if (entityMetadata != null)
128+
var entityMetadatas = entityMetadataManager.TryGetByLogicTableName(absTableName);
129+
if (entityMetadatas.IsNotEmpty())
130130
{
131131
migrationResult.CommandType = MigrationCommandTypeEnum.TableCommand;
132132

133-
134-
bool isShardingDataSource = entityMetadata.IsShardingDataSource();
133+
bool isShardingDataSource =entityMetadatas.Count==1&& entityMetadatas[0].IsShardingDataSource();
135134
if (isShardingDataSource)
136135
{
137-
var virtualDataSourceRoute = dataSourceRouteManager.GetRoute(entityMetadata.EntityType);
136+
var virtualDataSourceRoute = dataSourceRouteManager.GetRoute(entityMetadatas[0].EntityType);
138137
isShardingDataSource = virtualDataSourceRoute.GetAllDataSourceNames().Contains(dataSourceName);
139138

140139
if (isShardingDataSource)

0 commit comments

Comments
 (0)