diff --git a/nuget-publish.bat b/nuget-publish.bat index 837a69af..263fe3b9 100644 --- a/nuget-publish.bat +++ b/nuget-publish.bat @@ -1,8 +1,8 @@ :start ::定义版本 -set EFCORE2=2.3.1.10 -set EFCORE3=3.3.1.10 -set EFCORE5=5.3.1.10 +set EFCORE2=2.3.1.11 +set EFCORE3=3.3.1.11 +set EFCORE5=5.3.1.11 ::删除所有bin与obj下的文件 @echo off diff --git a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs index 7d946383..e62fb677 100644 --- a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs +++ b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs @@ -60,7 +60,7 @@ namespace Samples.AbpSharding //public void ShardingUpgrade() //{ - // //isExecutor = true; + // //IsExecutor = true; //} public DbContext GetDbContext(string dataSourceName, bool parallelQuery, IRouteTail routeTail) diff --git a/src/ShardingCore/Core/VirtualDatabase/ShardingEntityConfig.cs b/src/ShardingCore/Core/VirtualDatabase/ShardingEntityConfig.cs index 9b85a0d1..3baec6f7 100644 --- a/src/ShardingCore/Core/VirtualDatabase/ShardingEntityConfig.cs +++ b/src/ShardingCore/Core/VirtualDatabase/ShardingEntityConfig.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Reflection; using System.Text; namespace ShardingCore.Core.VirtualDatabase @@ -29,6 +30,11 @@ namespace ShardingCore.Core.VirtualDatabase /// 分库字段 /// public string ShardingDataSourceField { get; set; } + /// + /// 主键名称 + /// + public string SinglePrimaryKeyFieldName { get; set; } + /// /// 启动时是否建表 auto create data source when start app diff --git a/src/ShardingCore/Core/VirtualDatabase/VirtualDataSources/IVirtualDataSource.cs b/src/ShardingCore/Core/VirtualDatabase/VirtualDataSources/IVirtualDataSource.cs index 0e5513c1..b9765b80 100644 --- a/src/ShardingCore/Core/VirtualDatabase/VirtualDataSources/IVirtualDataSource.cs +++ b/src/ShardingCore/Core/VirtualDatabase/VirtualDataSources/IVirtualDataSource.cs @@ -15,11 +15,8 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources * @Date: Friday, 05 February 2021 13:01:39 * @Email: 326308290@qq.com */ - /// - /// 虚拟数据源 连接所有的实际数据源 - /// - public interface IVirtualDataSource - where TShardingDbContext : DbContext, IShardingDbContext + + public interface IVirtualDataSource { string DefaultDataSourceName { get; } /// @@ -55,4 +52,11 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources bool AddVirtualDataSourceRoute(IVirtualDataSourceRoute virtualDataSourceRoute); bool IsDefault(string dataSourceName); } + /// + /// 虚拟数据源 连接所有的实际数据源 + /// + public interface IVirtualDataSource : IVirtualDataSource + where TShardingDbContext : DbContext, IShardingDbContext + { + } } \ No newline at end of file diff --git a/src/ShardingCore/EFCores/ShardingInternalDbSet.cs b/src/ShardingCore/EFCores/ShardingInternalDbSet.cs index e846a281..7fb192c6 100644 --- a/src/ShardingCore/EFCores/ShardingInternalDbSet.cs +++ b/src/ShardingCore/EFCores/ShardingInternalDbSet.cs @@ -8,6 +8,12 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using ShardingCore.Core.VirtualDatabase.VirtualDataSources; +using ShardingCore.Core.VirtualDatabase.VirtualTables; +using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails; +using ShardingCore.Core.VirtualRoutes.TableRoutes.RouteTails.Abstractions; +using ShardingCore.Extensions; +using ShardingCore.Utils; namespace ShardingCore.EFCores { @@ -37,6 +43,40 @@ namespace ShardingCore.EFCores _context = (IShardingDbContext)context; } #endif + private IVirtualDataSource _virtualDataSource; + + protected IVirtualDataSource VirtualDataSource + { + get + { + if (null == _virtualDataSource) + { + _virtualDataSource = + (IVirtualDataSource) ShardingContainer.GetService( + typeof(IVirtualDataSource<>).GetGenericType0(_context.GetType())); + } + + return _virtualDataSource; + } + } + + private IVirtualTableManager _virtualTableManager; + + protected IVirtualTableManager VirtualTableManager + { + get + { + if (null == _virtualTableManager) + { + _virtualTableManager = + (IVirtualTableManager) ShardingContainer.GetService( + typeof(IVirtualTableManager<>).GetGenericType0(_context.GetType())); + } + + return _virtualTableManager; + } + } + /// /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to /// the same compatibility standards as public APIs. It may be changed or removed without notice in @@ -366,6 +406,89 @@ namespace ShardingCore.EFCores } } + public override TEntity Find(params object[] keyValues) + { + var primaryKeyFindDbContext = GetDbContextByKeyValue(keyValues); + if (primaryKeyFindDbContext != null) + { + return primaryKeyFindDbContext.Set().Find(keyValues); + } + return base.Find(keyValues); + } + +#if !EFCORE2 + public override ValueTask FindAsync(params object[] keyValues) + { + var primaryKeyFindDbContext = GetDbContextByKeyValue(keyValues); + if (primaryKeyFindDbContext != null) + { + return primaryKeyFindDbContext.Set().FindAsync(keyValues); + } + return base.FindAsync(keyValues); + } + + public override ValueTask FindAsync(object[] keyValues, CancellationToken cancellationToken) + { + var primaryKeyFindDbContext = GetDbContextByKeyValue(keyValues); + if (primaryKeyFindDbContext != null) + { + return primaryKeyFindDbContext.Set().FindAsync(keyValues, cancellationToken); + } + return base.FindAsync(keyValues, cancellationToken); + } +#endif +#if EFCORE2 + public override Task FindAsync(params object[] keyValues) + { + var primaryKeyFindDbContext = GetDbContextByKeyValue(keyValues); + if (primaryKeyFindDbContext != null) + { + return primaryKeyFindDbContext.Set().FindAsync(keyValues); + } + return base.FindAsync(keyValues); + } + + public override Task FindAsync(object[] keyValues, CancellationToken cancellationToken) + { + var primaryKeyFindDbContext = GetDbContextByKeyValue(keyValues); + if (primaryKeyFindDbContext != null) + { + return primaryKeyFindDbContext.Set().FindAsync(keyValues, cancellationToken); + } + return base.FindAsync(keyValues, cancellationToken); + } +#endif + + private DbContext GetDbContextByKeyValue(params object[] keyValues) + { + if (keyValues.Length == 1) + { + var shardingEntityConfig = ShardingUtil.Parse(typeof(TEntity)); + //单key字段 + if (null != shardingEntityConfig.SinglePrimaryKeyFieldName) + { + var isShardingDataSource = typeof(TEntity).IsShardingDataSource(); + var shardingDataSourceFieldIsKey = shardingEntityConfig.ShardingDataSourceFieldIsKey(); + if (isShardingDataSource && !shardingDataSourceFieldIsKey) + return null; + var isShardingTable = typeof(TEntity).IsShardingTable(); + var shardingTableFieldIsKey = shardingEntityConfig.ShardingTableFieldIsKey(); + if (isShardingTable && !shardingTableFieldIsKey) + return null; + var primaryKeyValue = keyValues[0]; + if (primaryKeyValue != null) + { + var dataSourceName = VirtualDataSource.GetDataSourceName(primaryKeyValue); + var tableTail = VirtualTableManager.GetTableTail(primaryKeyValue); + var routeTail = ShardingContainer.GetService().Create(tableTail); + return _context.GetDbContext(dataSourceName, false, routeTail); + } + } + } + + return null; + } + } } \ No newline at end of file diff --git a/src/ShardingCore/Extensions/ShardingEntityConfigExtension.cs b/src/ShardingCore/Extensions/ShardingEntityConfigExtension.cs new file mode 100644 index 00000000..2d85587f --- /dev/null +++ b/src/ShardingCore/Extensions/ShardingEntityConfigExtension.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; +using ShardingCore.Core.VirtualDatabase; + +namespace ShardingCore.Extensions +{ + public static class ShardingEntityConfigExtension + { + public static bool ShardingDataSourceFieldIsKey(this ShardingEntityConfig shardingEntityConfig) + { + if (string.IsNullOrWhiteSpace(shardingEntityConfig.ShardingDataSourceField)) + return false; + return shardingEntityConfig.ShardingDataSourceField == shardingEntityConfig.SinglePrimaryKeyFieldName; + } + public static bool ShardingTableFieldIsKey(this ShardingEntityConfig shardingEntityConfig) + { + if (string.IsNullOrWhiteSpace(shardingEntityConfig.ShardingTableField)) + return false; + return shardingEntityConfig.ShardingTableField == shardingEntityConfig.SinglePrimaryKeyFieldName; + } + } +} diff --git a/src/ShardingCore/Extensions/VirtualDataBaseExtension.cs b/src/ShardingCore/Extensions/VirtualDataBaseExtension.cs index 9599912c..4f5f95cf 100644 --- a/src/ShardingCore/Extensions/VirtualDataBaseExtension.cs +++ b/src/ShardingCore/Extensions/VirtualDataBaseExtension.cs @@ -79,6 +79,14 @@ namespace ShardingCore.Extensions var physicTable = virtualTableManager.GetVirtualTable(entity.GetType()).RouteTo(new ShardingTableRouteConfig(null, entity as IShardingTable, null))[0]; return physicTable.Tail; } + public static string GetTableTail(this IVirtualTableManager virtualTableManager, + object shardingKeyValue) where TEntity : class + { + if (!typeof(TEntity).IsShardingTable()) + return string.Empty; + var physicTable = virtualTableManager.GetVirtualTable(typeof(TEntity)).RouteTo(new ShardingTableRouteConfig(shardingKeyValue: shardingKeyValue))[0]; + return physicTable.Tail; + } public static bool IsVirtualDataSourceRoute(this Type routeType) { if (routeType == null) diff --git a/src/ShardingCore/Extensions/VirtualDataSourceExtension.cs b/src/ShardingCore/Extensions/VirtualDataSourceExtension.cs index 5fdc1704..42a97cfc 100644 --- a/src/ShardingCore/Extensions/VirtualDataSourceExtension.cs +++ b/src/ShardingCore/Extensions/VirtualDataSourceExtension.cs @@ -1,14 +1,12 @@ -using System; +using Microsoft.EntityFrameworkCore; +using ShardingCore.Core; +using ShardingCore.Core.VirtualDatabase.VirtualDataSources; +using ShardingCore.Core.VirtualRoutes; +using ShardingCore.Sharding.Abstractions; +using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -using System.Text; -using Microsoft.EntityFrameworkCore; -using ShardingCore.Core; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources; -using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources; -using ShardingCore.Core.VirtualRoutes; -using ShardingCore.Sharding.Abstractions; namespace ShardingCore.Extensions { @@ -21,7 +19,7 @@ namespace ShardingCore.Extensions */ public static class VirtualDataSourceExtension { - public static string GetDataSourceName(this IVirtualDataSource virtualDataSource,TEntity entity) where TShardingDbContext : DbContext, IShardingDbContext where TEntity : class + public static string GetDataSourceName(this IVirtualDataSource virtualDataSource,TEntity entity)where TEntity : class { if (!entity.IsShardingDataSource()) return virtualDataSource.DefaultDataSourceName; @@ -30,12 +28,19 @@ namespace ShardingCore.Extensions new ShardingDataSourceRouteConfig(shardingDataSource: entity as IShardingDataSource))[0]; } - public static List GetDataSourceNames(this IVirtualDataSource virtualDataSource, Expression> where) - where TShardingDbContext : DbContext, IShardingDbContext + public static List GetDataSourceNames(this IVirtualDataSource virtualDataSource, Expression> where) where TEntity : class { return virtualDataSource.RouteTo(typeof(TEntity),new ShardingDataSourceRouteConfig(predicate: where)) .ToList(); } + public static string GetDataSourceName(this IVirtualDataSource virtualDataSource, object shardingKeyValue) where TEntity : class + { + if (!typeof(TEntity).IsShardingDataSource()) + return virtualDataSource.DefaultDataSourceName; + + return virtualDataSource.RouteTo(typeof(TEntity), + new ShardingDataSourceRouteConfig(shardingKeyValue:shardingKeyValue))[0]; + } } } diff --git a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs index c4ad9318..be65b604 100644 --- a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs +++ b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs @@ -39,6 +39,8 @@ namespace ShardingCore.Sharding (IShardingDbContextExecutor)Activator.CreateInstance( typeof(ShardingDbContextExecutor<>).GetGenericType0(this.GetType()),this); } + + IsExecutor = wrapOptionsExtension == null; } /// /// 读写分离优先级 @@ -60,11 +62,12 @@ namespace ShardingCore.Sharding /// /// 是否是真正的执行者 /// - private bool isExecutor => _shardingDbContextExecutor == null; + public bool IsExecutor { get; } + //public void ShardingUpgrade() //{ - // //isExecutor = true; + // //IsExecutor = true; //} public DbContext GetDbContext(string dataSourceName, bool parallelQuery, IRouteTail routeTail) @@ -86,14 +89,14 @@ namespace ShardingCore.Sharding public override EntityEntry Add(object entity) { - if (isExecutor) + if (IsExecutor) base.Add(entity); return CreateGenericDbContext(entity).Add(entity); } public override EntityEntry Add(TEntity entity) { - if (isExecutor) + if (IsExecutor) return base.Add(entity); return CreateGenericDbContext(entity).Add(entity); } @@ -104,14 +107,14 @@ namespace ShardingCore.Sharding public override ValueTask> AddAsync(TEntity entity, CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) return base.AddAsync(entity, cancellationToken); return CreateGenericDbContext(entity).AddAsync(entity, cancellationToken); } public override ValueTask AddAsync(object entity, CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) return base.AddAsync(entity, cancellationToken); return CreateGenericDbContext(entity).AddAsync(entity, cancellationToken); } @@ -119,14 +122,14 @@ namespace ShardingCore.Sharding #if EFCORE2 public override Task> AddAsync(TEntity entity, CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) return base.AddAsync(entity, cancellationToken); return CreateGenericDbContext(entity).AddAsync(entity, cancellationToken); } public override Task AddAsync(object entity, CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) return base.AddAsync(entity, cancellationToken); return CreateGenericDbContext(entity).AddAsync(entity, cancellationToken); } @@ -134,7 +137,7 @@ namespace ShardingCore.Sharding public override void AddRange(params object[] entities) { - if (isExecutor) + if (IsExecutor) { base.AddRange(entities); return; @@ -157,7 +160,7 @@ namespace ShardingCore.Sharding public override void AddRange(IEnumerable entities) { - if (isExecutor) + if (IsExecutor) { base.AddRange(entities); return; @@ -180,7 +183,7 @@ namespace ShardingCore.Sharding public override async Task AddRangeAsync(params object[] entities) { - if (isExecutor) + if (IsExecutor) { await base.AddRangeAsync(entities); return; @@ -203,7 +206,7 @@ namespace ShardingCore.Sharding public override async Task AddRangeAsync(IEnumerable entities, CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) { await base.AddRangeAsync(entities, cancellationToken); return; @@ -226,21 +229,21 @@ namespace ShardingCore.Sharding public override EntityEntry Attach(TEntity entity) { - if (isExecutor) + if (IsExecutor) return base.Attach(entity); return CreateGenericDbContext(entity).Attach(entity); } public override EntityEntry Attach(object entity) { - if (isExecutor) + if (IsExecutor) return base.Attach(entity); return CreateGenericDbContext(entity).Attach(entity); } public override void AttachRange(params object[] entities) { - if (isExecutor) + if (IsExecutor) { base.AttachRange(entities); return; @@ -263,7 +266,7 @@ namespace ShardingCore.Sharding public override void AttachRange(IEnumerable entities) { - if (isExecutor) + if (IsExecutor) { base.AttachRange(entities); return; @@ -291,35 +294,35 @@ namespace ShardingCore.Sharding public override EntityEntry Entry(TEntity entity) { - if (isExecutor) + if (IsExecutor) return base.Entry(entity); return CreateGenericDbContext(entity).Entry(entity); } public override EntityEntry Entry(object entity) { - if (isExecutor) + if (IsExecutor) return base.Entry(entity); return CreateGenericDbContext(entity).Entry(entity); } public override EntityEntry Update(TEntity entity) { - if (isExecutor) + if (IsExecutor) return base.Update(entity); return CreateGenericDbContext(entity).Update(entity); } public override EntityEntry Update(object entity) { - if (isExecutor) + if (IsExecutor) return base.Update(entity); return CreateGenericDbContext(entity).Update(entity); } public override void UpdateRange(params object[] entities) { - if (isExecutor) + if (IsExecutor) { base.UpdateRange(entities); return; @@ -342,7 +345,7 @@ namespace ShardingCore.Sharding public override void UpdateRange(IEnumerable entities) { - if (isExecutor) + if (IsExecutor) { base.UpdateRange(entities); return; @@ -365,21 +368,21 @@ namespace ShardingCore.Sharding public override EntityEntry Remove(TEntity entity) { - if (isExecutor) + if (IsExecutor) return base.Remove(entity); return CreateGenericDbContext(entity).Remove(entity); } public override EntityEntry Remove(object entity) { - if (isExecutor) + if (IsExecutor) return base.Remove(entity); return CreateGenericDbContext(entity).Remove(entity); } public override void RemoveRange(params object[] entities) { - if (isExecutor) + if (IsExecutor) { base.RemoveRange(entities); return; @@ -402,7 +405,7 @@ namespace ShardingCore.Sharding public override void RemoveRange(IEnumerable entities) { - if (isExecutor) + if (IsExecutor) { base.RemoveRange(entities); return; @@ -456,14 +459,14 @@ namespace ShardingCore.Sharding public override int SaveChanges() { - if (isExecutor) + if (IsExecutor) return base.SaveChanges(); return this.SaveChanges(true); } public override int SaveChanges(bool acceptAllChangesOnSuccess) { - if (isExecutor) + if (IsExecutor) return base.SaveChanges(acceptAllChangesOnSuccess); //ApplyShardingConcepts(); int i = 0; @@ -487,14 +490,14 @@ namespace ShardingCore.Sharding public override Task SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) return base.SaveChangesAsync(cancellationToken); return this.SaveChangesAsync(true, cancellationToken); } public override async Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken()) { - if (isExecutor) + if (IsExecutor) return await base.SaveChangesAsync(acceptAllChangesOnSuccess,cancellationToken); //ApplyShardingConcepts(); int i = 0; @@ -524,7 +527,7 @@ namespace ShardingCore.Sharding public override void Dispose() { - if (isExecutor) + if (IsExecutor) { base.Dispose(); } @@ -538,7 +541,7 @@ namespace ShardingCore.Sharding public override async ValueTask DisposeAsync() { - if (isExecutor) + if (IsExecutor) { await base.DisposeAsync(); } diff --git a/src/ShardingCore/Sharding/Abstractions/IShardingDbContext.cs b/src/ShardingCore/Sharding/Abstractions/IShardingDbContext.cs index 7927693a..784a495f 100644 --- a/src/ShardingCore/Sharding/Abstractions/IShardingDbContext.cs +++ b/src/ShardingCore/Sharding/Abstractions/IShardingDbContext.cs @@ -20,6 +20,7 @@ namespace ShardingCore.Sharding.Abstractions /// /// DbContext GetDbContext(string dataSourceName, bool parallelQuery, IRouteTail routeTail); + /// /// 创建通用的db context /// @@ -28,5 +29,6 @@ namespace ShardingCore.Sharding.Abstractions /// DbContext CreateGenericDbContext(T entity) where T : class; + } } \ No newline at end of file diff --git a/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs b/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs index 621634df..c39b1d84 100644 --- a/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs +++ b/src/ShardingCore/Sharding/ShardingDbContextExecutors/ShardingDbContextExecutor.cs @@ -98,6 +98,7 @@ namespace ShardingCore.Sharding.ShardingDbContextExecutors return dbContext; } } + private DbContextOptions CreateParallelDbContextOptions(string dataSourceName) { var dbContextOptionBuilder = DataSourceDbContext.CreateDbContextOptionBuilder(); diff --git a/src/ShardingCore/ShardingDbContextBootstrapper.cs b/src/ShardingCore/ShardingDbContextBootstrapper.cs index 675c9aa4..ceecd937 100644 --- a/src/ShardingCore/ShardingDbContextBootstrapper.cs +++ b/src/ShardingCore/ShardingDbContextBootstrapper.cs @@ -78,8 +78,13 @@ namespace ShardingCore EnsureCreated(context, dataSourceName); foreach (var entity in context.Model.GetEntityTypes()) { - //ShardingKeyUtil.ParsePrimaryKeyName(entity); - var entityType = entity.ClrType; + var entityType = entity.ClrType; + var primaryKeyNames = ShardingKeyUtil.ParsePrimaryKeyName(entity); + if (primaryKeyNames.Properties.Count == 1) + { + var shardingEntityConfig = ShardingUtil.Parse(entityType); + shardingEntityConfig.SinglePrimaryKeyFieldName = primaryKeyNames.Properties.First().Name; + } //添加追踪模型 _trackerManager.AddDbContextModel(entityType); if (entityType.IsShardingDataSource()) diff --git a/src/ShardingCore/Utils/ShardingKeyUtil.cs b/src/ShardingCore/Utils/ShardingKeyUtil.cs index 79503fd1..5b9d3dd2 100644 --- a/src/ShardingCore/Utils/ShardingKeyUtil.cs +++ b/src/ShardingCore/Utils/ShardingKeyUtil.cs @@ -28,10 +28,11 @@ namespace ShardingCore.Utils { } - public static void ParsePrimaryKeyName(IEntityType entityType) + public static IKey ParsePrimaryKeyName(IEntityType entityType) { var primaryKey = entityType.FindPrimaryKey(); _caches.TryAdd(entityType.ClrType, primaryKey); + return primaryKey; } public static IEnumerable GetPrimaryKeyValues(object entity) @@ -54,6 +55,15 @@ namespace ShardingCore.Utils return primaryKey; } + public static IKey GetEntityIKey(Type entityType) + { + if (!_caches.TryGetValue(entityType, out var primaryKey)) + { + return null; + } + + return primaryKey; + } diff --git a/test/ShardingCore.Test50/ShardingTest.cs b/test/ShardingCore.Test50/ShardingTest.cs index b007058c..73015abe 100644 --- a/test/ShardingCore.Test50/ShardingTest.cs +++ b/test/ShardingCore.Test50/ShardingTest.cs @@ -255,6 +255,8 @@ namespace ShardingCore.Test50 { var sysUserMod = await _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); + var userMod = _virtualDbContext.Set().Find("1"); + Assert.Equal(sysUserMod, userMod); Assert.True(sysUserMod.Id == "1"); var user198 = await _virtualDbContext.Set().FirstOrDefaultAsync(o => o.Id == "198"); Assert.True(user198.Id == "198"); @@ -268,6 +270,7 @@ namespace ShardingCore.Test50 var sysUserMod = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); Assert.Equal("2", sysUserMod.Id); + } [Fact] diff --git a/test/ShardingCore.Test50/Startup.cs b/test/ShardingCore.Test50/Startup.cs index 94b48e46..2d65c789 100644 --- a/test/ShardingCore.Test50/Startup.cs +++ b/test/ShardingCore.Test50/Startup.cs @@ -54,6 +54,7 @@ namespace ShardingCore.Test50 { o.CreateShardingTableOnStart = true; o.EnsureCreatedWithOutShardingTable = true; + o.AutoTrackEntity = true; }) .AddShardingTransaction((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger)) diff --git a/test/ShardingCore.Test50_2x/ShardingTest.cs b/test/ShardingCore.Test50_2x/ShardingTest.cs index c5338782..d5eb3ee4 100644 --- a/test/ShardingCore.Test50_2x/ShardingTest.cs +++ b/test/ShardingCore.Test50_2x/ShardingTest.cs @@ -19,7 +19,7 @@ namespace ShardingCore.Test50_2x private readonly ShardingDefaultDbContext _virtualDbContext; private readonly IShardingRouteManager _shardingRouteManager; - public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager) + public ShardingTest(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager) { _virtualDbContext = virtualDbContext; _shardingRouteManager = shardingRouteManager; @@ -29,20 +29,19 @@ namespace ShardingCore.Test50_2x //public async Task Route_TEST() //{ // var queryable1 = _virtualDbContext.Set().Where(o=>o.Id=="339"); - // var routeResults1 = _routingRuleEngineFactory.Route(queryable1); + // var routeResults1 = _tableRouteRuleEngineFactory.Route(queryable1); // Assert.Equal(1,routeResults1.Count()); // Assert.Equal(1,routeResults1.FirstOrDefault().ReplaceTables.Count()); // Assert.Equal("0",routeResults1.FirstOrDefault().ReplaceTables.FirstOrDefault().Tail); // Assert.Equal(nameof(SysUserMod),routeResults1.FirstOrDefault().ReplaceTables.FirstOrDefault().OriginalName); // var ids = new[] {"339", "124","142"}; // var queryable2= _virtualDbContext.Set().Where(o=>ids.Contains(o.Id)); - // var routeResult2s = _routingRuleEngineFactory.Route(queryable2); + // var routeResult2s = _tableRouteRuleEngineFactory.Route(queryable2); // Assert.Equal(2,routeResult2s.Count()); // Assert.Equal(1,routeResult2s.FirstOrDefault().ReplaceTables.Count()); // Assert.Equal(2,routeResult2s.SelectMany(o=>o.ReplaceTables).Count()); // Assert.Equal(true,routeResult2s.SelectMany(o=>o.ReplaceTables).All(o=>new[]{"0","1"}.Contains(o.Tail))); //} - [Fact] public async Task ToList_All_Route_Test() { @@ -73,7 +72,6 @@ namespace ShardingCore.Test50_2x descAge--; } } - [Fact] public async Task ToList_All_Test() { @@ -97,6 +95,8 @@ namespace ShardingCore.Test50_2x descAge--; } + + var pageResult = await _virtualDbContext.Set().Skip(10).Take(10).OrderByDescending(o => o.Age).ToListAsync(); Assert.Equal(10, pageResult.Count); int pageDescAge = 990; @@ -121,7 +121,8 @@ namespace ShardingCore.Test50_2x DateOfMonth = salary.DateOfMonth, Name = u.Name }).ToListAsync(); - var list2 = list.OrderBy(o=>o.Age).Select(o=>o.Age).Distinct().ToList(); + + var list2 = list.OrderBy(o => o.Age).Select(o => o.Age).Distinct().ToList(); Assert.Equal(24000, list.Count()); Assert.Equal(24, list.Count(o => o.Name == "name_200")); @@ -165,7 +166,7 @@ namespace ShardingCore.Test50_2x [Fact] public async Task ToList_Id_In_Test() { - var ids = new[] {"1", "2", "3", "4"}; + var ids = new[] { "1", "2", "3", "4" }; var sysUserMods = await _virtualDbContext.Set().Where(o => ids.Contains(o.Id)).ToListAsync(); foreach (var id in ids) { @@ -241,6 +242,7 @@ namespace ShardingCore.Test50_2x var sysUserModDesc = await _virtualDbContext.Set().OrderByDescending(o => o.Id).FirstOrDefaultAsync(); Assert.True(sysUserModDesc != null && sysUserModDesc.Id == "999"); + } [Fact] @@ -248,6 +250,8 @@ namespace ShardingCore.Test50_2x { var sysUserMod = await _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); + var userMod = _virtualDbContext.Set().Find("1"); + Assert.Equal(sysUserMod, userMod); Assert.True(sysUserMod.Id == "1"); var user198 = await _virtualDbContext.Set().FirstOrDefaultAsync(o => o.Id == "198"); Assert.True(user198.Id == "198"); @@ -261,6 +265,7 @@ namespace ShardingCore.Test50_2x var sysUserMod = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); Assert.Equal("2", sysUserMod.Id); + } [Fact] @@ -319,14 +324,14 @@ namespace ShardingCore.Test50_2x public async Task Max_Join_Test() { var queryable = (from u in _virtualDbContext.Set().Where(o => o.Id == "300") - join salary in _virtualDbContext.Set() - on u.Id equals salary.UserId - select new - { - Salary = salary.Salary, - DateOfMonth = salary.DateOfMonth, - Name = u.Name - }); + join salary in _virtualDbContext.Set() + on u.Id equals salary.UserId + select new + { + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }); var maxSalary = await queryable.MaxAsync(o => o.Salary); Assert.Equal(1390000, maxSalary); } @@ -360,25 +365,25 @@ namespace ShardingCore.Test50_2x [Fact] public async Task Group_Test() { - var ids = new[] {"200", "300"}; - var dateOfMonths = new[] {202111, 202110}; + var ids = new[] { "200", "300" }; + var dateOfMonths = new[] { 202111, 202110 }; var group = await (from u in _virtualDbContext.Set() .Where(o => ids.Contains(o.UserId) && dateOfMonths.Contains(o.DateOfMonth)) - group u by new - { - UId = u.UserId - } + group u by new + { + UId = u.UserId + } into g - select new - { - GroupUserId = g.Key.UId, - Count = g.Count(), - TotalSalary = g.Sum(o => o.Salary), - AvgSalary = g.Average(o => o.Salary), - AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), - MinSalary = g.Min(o => o.Salary), - MaxSalary = g.Max(o => o.Salary) - }).ToListAsync(); + select new + { + GroupUserId = g.Key.UId, + Count = g.Count(), + TotalSalary = g.Sum(o => o.Salary), + AvgSalary = g.Average(o => o.Salary), + AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), + MinSalary = g.Min(o => o.Salary), + MaxSalary = g.Max(o => o.Salary) + }).ToListAsync(); Assert.Equal(2, group.Count); Assert.Equal(2, group[0].Count); Assert.Equal(2260000, group[0].TotalSalary); diff --git a/test/ShardingCore.Test50_2x/Startup.cs b/test/ShardingCore.Test50_2x/Startup.cs index 03c35344..607046e6 100644 --- a/test/ShardingCore.Test50_2x/Startup.cs +++ b/test/ShardingCore.Test50_2x/Startup.cs @@ -51,6 +51,7 @@ namespace ShardingCore.Test50_2x { o.CreateShardingTableOnStart = true; o.EnsureCreatedWithOutShardingTable = true; + o.AutoTrackEntity = true; }) .AddShardingTransaction((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger)) diff --git a/test/ShardingCore.Test50_3x/ShardingTest.cs b/test/ShardingCore.Test50_3x/ShardingTest.cs index 1daf9743..61b5b2ec 100644 --- a/test/ShardingCore.Test50_3x/ShardingTest.cs +++ b/test/ShardingCore.Test50_3x/ShardingTest.cs @@ -29,20 +29,19 @@ namespace ShardingCore.Test50_3x //public async Task Route_TEST() //{ // var queryable1 = _virtualDbContext.Set().Where(o=>o.Id=="339"); - // var routeResults1 = _routingRuleEngineFactory.Route(queryable1); + // var routeResults1 = _tableRouteRuleEngineFactory.Route(queryable1); // Assert.Equal(1,routeResults1.Count()); // Assert.Equal(1,routeResults1.FirstOrDefault().ReplaceTables.Count()); // Assert.Equal("0",routeResults1.FirstOrDefault().ReplaceTables.FirstOrDefault().Tail); // Assert.Equal(nameof(SysUserMod),routeResults1.FirstOrDefault().ReplaceTables.FirstOrDefault().OriginalName); // var ids = new[] {"339", "124","142"}; // var queryable2= _virtualDbContext.Set().Where(o=>ids.Contains(o.Id)); - // var routeResult2s = _routingRuleEngineFactory.Route(queryable2); + // var routeResult2s = _tableRouteRuleEngineFactory.Route(queryable2); // Assert.Equal(2,routeResult2s.Count()); // Assert.Equal(1,routeResult2s.FirstOrDefault().ReplaceTables.Count()); // Assert.Equal(2,routeResult2s.SelectMany(o=>o.ReplaceTables).Count()); // Assert.Equal(true,routeResult2s.SelectMany(o=>o.ReplaceTables).All(o=>new[]{"0","1"}.Contains(o.Tail))); //} - [Fact] public async Task ToList_All_Route_Test() { @@ -73,7 +72,6 @@ namespace ShardingCore.Test50_3x descAge--; } } - [Fact] public async Task ToList_All_Test() { @@ -97,6 +95,8 @@ namespace ShardingCore.Test50_3x descAge--; } + + var pageResult = await _virtualDbContext.Set().Skip(10).Take(10).OrderByDescending(o => o.Age).ToListAsync(); Assert.Equal(10, pageResult.Count); int pageDescAge = 990; @@ -121,7 +121,8 @@ namespace ShardingCore.Test50_3x DateOfMonth = salary.DateOfMonth, Name = u.Name }).ToListAsync(); - var list2 = list.OrderBy(o=>o.Age).Select(o=>o.Age).Distinct().ToList(); + + var list2 = list.OrderBy(o => o.Age).Select(o => o.Age).Distinct().ToList(); Assert.Equal(24000, list.Count()); Assert.Equal(24, list.Count(o => o.Name == "name_200")); @@ -165,7 +166,7 @@ namespace ShardingCore.Test50_3x [Fact] public async Task ToList_Id_In_Test() { - var ids = new[] {"1", "2", "3", "4"}; + var ids = new[] { "1", "2", "3", "4" }; var sysUserMods = await _virtualDbContext.Set().Where(o => ids.Contains(o.Id)).ToListAsync(); foreach (var id in ids) { @@ -241,6 +242,7 @@ namespace ShardingCore.Test50_3x var sysUserModDesc = await _virtualDbContext.Set().OrderByDescending(o => o.Id).FirstOrDefaultAsync(); Assert.True(sysUserModDesc != null && sysUserModDesc.Id == "999"); + } [Fact] @@ -248,6 +250,8 @@ namespace ShardingCore.Test50_3x { var sysUserMod = await _virtualDbContext.Set().Where(o => o.Id == "1").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); + var userMod = _virtualDbContext.Set().Find("1"); + Assert.Equal(sysUserMod, userMod); Assert.True(sysUserMod.Id == "1"); var user198 = await _virtualDbContext.Set().FirstOrDefaultAsync(o => o.Id == "198"); Assert.True(user198.Id == "198"); @@ -261,6 +265,7 @@ namespace ShardingCore.Test50_3x var sysUserMod = await _virtualDbContext.Set().Where(o => o.Name == "name_2").FirstOrDefaultAsync(); Assert.NotNull(sysUserMod); Assert.Equal("2", sysUserMod.Id); + } [Fact] @@ -319,14 +324,14 @@ namespace ShardingCore.Test50_3x public async Task Max_Join_Test() { var queryable = (from u in _virtualDbContext.Set().Where(o => o.Id == "300") - join salary in _virtualDbContext.Set() - on u.Id equals salary.UserId - select new - { - Salary = salary.Salary, - DateOfMonth = salary.DateOfMonth, - Name = u.Name - }); + join salary in _virtualDbContext.Set() + on u.Id equals salary.UserId + select new + { + Salary = salary.Salary, + DateOfMonth = salary.DateOfMonth, + Name = u.Name + }); var maxSalary = await queryable.MaxAsync(o => o.Salary); Assert.Equal(1390000, maxSalary); } @@ -360,25 +365,25 @@ namespace ShardingCore.Test50_3x [Fact] public async Task Group_Test() { - var ids = new[] {"200", "300"}; - var dateOfMonths = new[] {202111, 202110}; + var ids = new[] { "200", "300" }; + var dateOfMonths = new[] { 202111, 202110 }; var group = await (from u in _virtualDbContext.Set() .Where(o => ids.Contains(o.UserId) && dateOfMonths.Contains(o.DateOfMonth)) - group u by new - { - UId = u.UserId - } + group u by new + { + UId = u.UserId + } into g - select new - { - GroupUserId = g.Key.UId, - Count = g.Count(), - TotalSalary = g.Sum(o => o.Salary), - AvgSalary = g.Average(o => o.Salary), - AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), - MinSalary = g.Min(o => o.Salary), - MaxSalary = g.Max(o => o.Salary) - }).ToListAsync(); + select new + { + GroupUserId = g.Key.UId, + Count = g.Count(), + TotalSalary = g.Sum(o => o.Salary), + AvgSalary = g.Average(o => o.Salary), + AvgSalaryDecimal = g.Average(o => o.SalaryDecimal), + MinSalary = g.Min(o => o.Salary), + MaxSalary = g.Max(o => o.Salary) + }).ToListAsync(); Assert.Equal(2, group.Count); Assert.Equal(2, group[0].Count); Assert.Equal(2260000, group[0].TotalSalary); diff --git a/test/ShardingCore.Test50_3x/Startup.cs b/test/ShardingCore.Test50_3x/Startup.cs index de2a568d..d1a3e9c1 100644 --- a/test/ShardingCore.Test50_3x/Startup.cs +++ b/test/ShardingCore.Test50_3x/Startup.cs @@ -47,6 +47,7 @@ namespace ShardingCore.Test50_3x { o.CreateShardingTableOnStart = true; o.EnsureCreatedWithOutShardingTable = true; + o.AutoTrackEntity = true; }) .AddShardingTransaction((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger))