Skip to content

Commit 72c6254

Browse files
committed
添加针对分片键的ValueGenerated的属性判断只允许Never [#196]
1 parent f1e2d1c commit 72c6254

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/ShardingCore/Core/EntityMetadatas/DefaultEntityMetadataManager.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
using System.Text;
66
using Microsoft.EntityFrameworkCore;
77
using Microsoft.EntityFrameworkCore.Metadata;
8+
using Microsoft.EntityFrameworkCore.Metadata.Internal;
9+
using Microsoft.Extensions.Logging;
10+
using ShardingCore.Core.ShardingConfigurations;
811
using ShardingCore.Exceptions;
912
using ShardingCore.Extensions;
1013
using ShardingCore.Sharding.Abstractions;
@@ -16,9 +19,14 @@ namespace ShardingCore.Core.EntityMetadatas
1619
/// </summary>
1720
public class DefaultEntityMetadataManager : IEntityMetadataManager
1821
{
22+
private readonly ShardingConfigOptions _shardingConfigOptions;
1923
private readonly ConcurrentDictionary<Type, EntityMetadata> _caches = new();
2024
private readonly ConcurrentDictionary<string/*logic table name*/, List<EntityMetadata>> _logicTableCaches = new();
2125

26+
public DefaultEntityMetadataManager(ShardingConfigOptions shardingConfigOptions)
27+
{
28+
_shardingConfigOptions = shardingConfigOptions;
29+
}
2230
public bool AddEntityMetadata(EntityMetadata entityMetadata)
2331
{
2432
return _caches.TryAdd(entityMetadata.EntityType, entityMetadata);
@@ -104,6 +112,33 @@ public bool TryInitModel(IEntityType efEntityType)
104112
{
105113
if (_caches.TryGetValue(efEntityType.ClrType, out var metadata))
106114
{
115+
if (_shardingConfigOptions.CheckShardingKeyValueGenerated)
116+
{
117+
if (metadata.IsMultiDataSourceMapping)
118+
{
119+
foreach (var metadataProperty in metadata.ShardingDataSourceProperties)
120+
{
121+
var propertyName = metadataProperty.Key;
122+
var property = efEntityType.GetProperty(propertyName);
123+
if (property.ValueGenerated!=ValueGenerated.Never)
124+
{
125+
throw new ShardingCoreConfigException($"sharding data source key:{propertyName} is not {nameof(ValueGenerated)}.{nameof(ValueGenerated.Never)}");
126+
}
127+
}
128+
}
129+
if (metadata.IsMultiTableMapping)
130+
{
131+
foreach (var metadataProperty in metadata.ShardingTableProperties)
132+
{
133+
var propertyName = metadataProperty.Key;
134+
var property = efEntityType.GetProperty(propertyName);
135+
if (property.ValueGenerated!=ValueGenerated.Never)
136+
{
137+
throw new ShardingCoreConfigException($"sharding table key:{propertyName} is not {nameof(ValueGenerated)}.{nameof(ValueGenerated.Never)}");
138+
}
139+
}
140+
}
141+
}
107142
metadata.SetEntityModel(efEntityType);
108143
if (string.IsNullOrWhiteSpace(metadata.LogicTableName))
109144
{

src/ShardingCore/Core/ShardingConfigurations/ShardingConfigOptions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ public class ShardingConfigOptions
5555
/// 默认数据源链接字符串
5656
/// </summary>
5757
public string DefaultConnectionString { get; private set; }
58+
59+
/// <summary>
60+
/// 检测分片键的自动值是否有疑义
61+
/// </summary>
62+
63+
public bool CheckShardingKeyValueGenerated { get; set; } = true;
5864
/// <summary>
5965
/// 添加默认数据源
6066
/// </summary>

0 commit comments

Comments
 (0)