diff --git a/README.md b/README.md index b1affd23..3aed61ed 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ Release | EF Core | .NET Standard | .NET (Core) | Sql Server | [Pomelo.EntityFrameworkCore.MySql](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql) --- | --- | --- | --- | --- | --- -[5.1.x.x](https://www.nuget.org/packages/ShardingCore/5.1.0.3) | >= 5.0.x | 2.1 | 3.0+ | >= 2012 | 5.0.0-alpha.2 -[3.1.x.x](https://www.nuget.org/packages/ShardingCore/3.1.0.3) | 3.1.10 | 2.0 | 2.0+ | >= 2012 | 3.2.4 -[2.1.x.x](https://www.nuget.org/packages/ShardingCore/2.1.0.3) | 2.2.6 | 2.0 | 2.0+ | >= 2008 | 2.2.6 +[5.1.x.x](https://www.nuget.org/packages/ShardingCore/5.1.0.9) | >= 5.0.x | 2.1 | 3.0+ | >= 2012 | 5.0.0-alpha.2 +[3.1.x.x](https://www.nuget.org/packages/ShardingCore/3.1.0.9) | 3.1.10 | 2.0 | 2.0+ | >= 2012 | 3.2.4 +[2.1.x.x](https://www.nuget.org/packages/ShardingCore/2.1.0.9) | 2.2.6 | 2.0 | 2.0+ | >= 2008 | 2.2.6 - [开始](#开始) @@ -80,7 +80,7 @@ Release | EF Core | .NET Standard | .NET (Core) | Sql Server | [Pomelo.EntityFr ## 安装 ```xml - + ``` ## 配置 diff --git a/ShardingCore.sln b/ShardingCore.sln index 2a76d07f..9f646238 100644 --- a/ShardingCore.sln +++ b/ShardingCore.sln @@ -41,9 +41,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples.AutoByDate.SqlServe EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.MySql", "samples\Sample.MySql\Sample.MySql.csproj", "{90675788-D5C3-415A-9C18-FF159A75B4D5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.SqlServer3x", "samples\Sample.SqlServer3x\Sample.SqlServer3x.csproj", "{447D5357-F095-45DE-9DA5-2D9997237366}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample.SqlServer3x", "samples\Sample.SqlServer3x\Sample.SqlServer3x.csproj", "{447D5357-F095-45DE-9DA5-2D9997237366}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShardingCoreTestSqlServer3x", "test\ShardingCoreTestSqlServer3x\ShardingCoreTestSqlServer3x.csproj", "{1CE858B8-56D8-4009-BF46-EE0F79F259D1}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ShardingCoreTestSqlServer3x", "test\ShardingCoreTestSqlServer3x\ShardingCoreTestSqlServer3x.csproj", "{1CE858B8-56D8-4009-BF46-EE0F79F259D1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShardingCoreTestBatch", "test\ShardingCoreTestBatch\ShardingCoreTestBatch.csproj", "{54BA9F11-96CD-47DF-97FB-0BC83D2F7081}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -115,6 +117,10 @@ Global {1CE858B8-56D8-4009-BF46-EE0F79F259D1}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CE858B8-56D8-4009-BF46-EE0F79F259D1}.Release|Any CPU.ActiveCfg = Release|Any CPU {1CE858B8-56D8-4009-BF46-EE0F79F259D1}.Release|Any CPU.Build.0 = Release|Any CPU + {54BA9F11-96CD-47DF-97FB-0BC83D2F7081}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {54BA9F11-96CD-47DF-97FB-0BC83D2F7081}.Debug|Any CPU.Build.0 = Debug|Any CPU + {54BA9F11-96CD-47DF-97FB-0BC83D2F7081}.Release|Any CPU.ActiveCfg = Release|Any CPU + {54BA9F11-96CD-47DF-97FB-0BC83D2F7081}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -136,6 +142,7 @@ Global {90675788-D5C3-415A-9C18-FF159A75B4D5} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73} {447D5357-F095-45DE-9DA5-2D9997237366} = {EDF8869A-C1E1-491B-BC9F-4A33F4DE1C73} {1CE858B8-56D8-4009-BF46-EE0F79F259D1} = {CC2C88C0-65F2-445D-BE78-973B840FE281} + {54BA9F11-96CD-47DF-97FB-0BC83D2F7081} = {CC2C88C0-65F2-445D-BE78-973B840FE281} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8C07A667-E8B4-43C7-8053-721584BAD291} diff --git a/nuget-publish.bat b/nuget-publish.bat index 6e0ed12a..e45275e8 100644 --- a/nuget-publish.bat +++ b/nuget-publish.bat @@ -1,8 +1,8 @@ :start ::定义版本 -set EFCORE2=2.1.0.8 -set EFCORE3=3.1.0.8 -set EFCORE5=5.1.0.8 +set EFCORE2=2.1.0.10 +set EFCORE3=3.1.0.10 +set EFCORE5=5.1.0.10 ::删除所有bin与obj下的文件 @echo off diff --git a/samples/Sample.MySql/DbContexts/DefaultTableDbContext.cs b/samples/Sample.MySql/DbContexts/DefaultTableDbContext.cs index 5251d146..ac665902 100644 --- a/samples/Sample.MySql/DbContexts/DefaultTableDbContext.cs +++ b/samples/Sample.MySql/DbContexts/DefaultTableDbContext.cs @@ -6,7 +6,7 @@ namespace Sample.MySql.DbContexts { public class DefaultTableDbContext: DbContext,IShardingTableDbContext { - public DefaultTableDbContext(ShardingDbContextOptions shardingDbContextOptions):base(shardingDbContextOptions.DbContextOptions) + public DefaultTableDbContext(DbContextOptions options) :base(options) { } diff --git a/samples/Sample.SqlServer/DbContexts/DefaultTableDbContext.cs b/samples/Sample.SqlServer/DbContexts/DefaultTableDbContext.cs index 28210063..a7198824 100644 --- a/samples/Sample.SqlServer/DbContexts/DefaultTableDbContext.cs +++ b/samples/Sample.SqlServer/DbContexts/DefaultTableDbContext.cs @@ -10,7 +10,7 @@ namespace Sample.SqlServer.DbContexts { public class DefaultTableDbContext: DbContext,IShardingTableDbContext { - public DefaultTableDbContext(ShardingDbContextOptions shardingDbContextOptions):base(shardingDbContextOptions.DbContextOptions) + public DefaultTableDbContext(DbContextOptions options) :base(options) { } diff --git a/samples/Samples.AutoByDate.SqlServer/Jobs/AutoCreateTableByDay.cs b/samples/Samples.AutoByDate.SqlServer/Jobs/AutoCreateTableByDay.cs index fd947bfc..8fdca22e 100644 --- a/samples/Samples.AutoByDate.SqlServer/Jobs/AutoCreateTableByDay.cs +++ b/samples/Samples.AutoByDate.SqlServer/Jobs/AutoCreateTableByDay.cs @@ -8,12 +8,12 @@ using ShardingCore.TableCreator; namespace Samples.AutoByDate.SqlServer.Jobs { -/* -* @Author: xjm -* @Description: -* @Date: Tuesday, 02 February 2021 17:24:17 -* @Email: 326308290@qq.com -*/ + /* + * @Author: xjm + * @Description: + * @Date: Tuesday, 02 February 2021 17:24:17 + * @Email: 326308290@qq.com + */ //public class AutoCreateTableByDay : IJob //{ // /// @@ -34,8 +34,8 @@ namespace Samples.AutoByDate.SqlServer.Jobs // var tail = virtualTable.GetVirtualRoute().ShardingKeyToTail(now); // try // { - // tableCreator.CreateTable(tail); // virtualTableManager.AddPhysicTable(virtualTable, new DefaultPhysicTable(virtualTable, tail)); + // tableCreator.CreateTable(tail); // } // catch (Exception e) // { diff --git a/src/ShardingCore.MySql/ShardingMySqlParallelDbContextFactory.cs b/src/ShardingCore.MySql/ShardingMySqlParallelDbContextFactory.cs index 9c6084fc..af263148 100644 --- a/src/ShardingCore.MySql/ShardingMySqlParallelDbContextFactory.cs +++ b/src/ShardingCore.MySql/ShardingMySqlParallelDbContextFactory.cs @@ -35,7 +35,7 @@ namespace ShardingCore.MySql { var shardingConfigEntry = _shardingCoreOptions.GetShardingConfig(connectKey); var shardingDbContextOptions = new ShardingDbContextOptions(CreateOptions(connectKey,shardingConfigEntry.ConnectionString), tail); - return _shardingDbContextFactory.Create(connectKey, shardingDbContextOptions,null); + return _shardingDbContextFactory.Create(connectKey, shardingDbContextOptions); } private DbContextOptions CreateOptions(string connectKey, string connectionString) diff --git a/src/ShardingCore.SqlServer/ShardingSqlServerParallelDbContextFactory.cs b/src/ShardingCore.SqlServer/ShardingSqlServerParallelDbContextFactory.cs index 94b88f4f..0a5adc8d 100644 --- a/src/ShardingCore.SqlServer/ShardingSqlServerParallelDbContextFactory.cs +++ b/src/ShardingCore.SqlServer/ShardingSqlServerParallelDbContextFactory.cs @@ -36,7 +36,7 @@ namespace ShardingCore.SqlServer { var shardingConfigEntry = _shardingCoreOptions.GetShardingConfig(connectKey); var shardingDbContextOptions = new ShardingDbContextOptions(CreateOptions(connectKey, shardingConfigEntry.ConnectionString), tail); - return _shardingDbContextFactory.Create(connectKey, shardingDbContextOptions,null); + return _shardingDbContextFactory.Create(connectKey, shardingDbContextOptions); } private DbContextOptions CreateOptions(string connectKey, string connectString) diff --git a/src/ShardingCore/DbContexts/Abstractions/IDbContextCreateFilter.cs b/src/ShardingCore/DbContexts/Abstractions/IDbContextCreateFilter.cs index b51a0dc8..e284cdc3 100644 --- a/src/ShardingCore/DbContexts/Abstractions/IDbContextCreateFilter.cs +++ b/src/ShardingCore/DbContexts/Abstractions/IDbContextCreateFilter.cs @@ -19,6 +19,6 @@ namespace ShardingCore.DbContexts.Abstractions /// /// /// - void CreateAfter(DbContext dbContext, IServiceProvider s); + void CreateAfter(DbContext dbContext); } } diff --git a/src/ShardingCore/DbContexts/IShardingDbContextFactory.cs b/src/ShardingCore/DbContexts/IShardingDbContextFactory.cs index 010e5243..efd2519a 100644 --- a/src/ShardingCore/DbContexts/IShardingDbContextFactory.cs +++ b/src/ShardingCore/DbContexts/IShardingDbContextFactory.cs @@ -13,7 +13,7 @@ namespace ShardingCore.DbContexts */ public interface IShardingDbContextFactory { - DbContext Create(string connectKey,ShardingDbContextOptions shardingDbContextOptions,IServiceProvider serviceProvider); - DbContext Create(string connectKey,string tail, IServiceProvider serviceProvider); + DbContext Create(string connectKey,ShardingDbContextOptions shardingDbContextOptions); + DbContext Create(string connectKey,string tail, IDbContextOptionsProvider dbContextOptionsProvider); } } \ No newline at end of file diff --git a/src/ShardingCore/DbContexts/ShardingDbContextFactory.cs b/src/ShardingCore/DbContexts/ShardingDbContextFactory.cs index 7c1d2747..49326788 100644 --- a/src/ShardingCore/DbContexts/ShardingDbContextFactory.cs +++ b/src/ShardingCore/DbContexts/ShardingDbContextFactory.cs @@ -28,7 +28,7 @@ namespace ShardingCore.DbContexts _shardingTableScopeFactory = shardingTableScopeFactory; _dbContextCreateFilterManager = dbContextCreateFilterManager; } - public DbContext Create(string connectKey, ShardingDbContextOptions shardingDbContextOptions,IServiceProvider serviceProvider) + public DbContext Create(string connectKey, ShardingDbContextOptions shardingDbContextOptions) { var shardingConfigEntry = _shardingCoreOptions.GetShardingConfig(connectKey); @@ -48,15 +48,12 @@ namespace ShardingCore.DbContexts shardingTableDbContext.ModelChangeKey = modelChangeKey; } - if (serviceProvider != null) + var filters = _dbContextCreateFilterManager.GetFilters(); + if (filters.Any()) { - var filters = _dbContextCreateFilterManager.GetFilters(); - if (filters.Any()) + foreach (var dbContextCreateFilter in filters) { - foreach (var dbContextCreateFilter in filters) - { - dbContextCreateFilter.CreateAfter(dbContext, serviceProvider); - } + dbContextCreateFilter.CreateAfter(dbContext); } } var dbContextModel = dbContext.Model; @@ -64,12 +61,11 @@ namespace ShardingCore.DbContexts } } - public DbContext Create(string connectKey, string tail,IServiceProvider serviceProvider) + public DbContext Create(string connectKey, string tail, IDbContextOptionsProvider dbContextOptionsProvider) { - var dbContextOptionsProvider = serviceProvider.GetService(); var shardingDbContextOptions = new ShardingDbContextOptions(dbContextOptionsProvider.GetDbContextOptions(connectKey), tail); - return Create(connectKey,shardingDbContextOptions,serviceProvider); + return Create(connectKey,shardingDbContextOptions); } } } \ No newline at end of file diff --git a/src/ShardingCore/DbContexts/VirtualDbContexts/VirtualDbContext.cs b/src/ShardingCore/DbContexts/VirtualDbContexts/VirtualDbContext.cs index 384dcb5b..958b3971 100644 --- a/src/ShardingCore/DbContexts/VirtualDbContexts/VirtualDbContext.cs +++ b/src/ShardingCore/DbContexts/VirtualDbContexts/VirtualDbContext.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; using ShardingCore.Core; using ShardingCore.Core.VirtualDataSources; using ShardingCore.Core.VirtualRoutes; @@ -382,7 +383,7 @@ namespace ShardingCore.DbContexts.VirtualDbContexts } if(!dbContexts.TryGetValue(tail,out var dbContext)) { - dbContext = _shardingDbContextFactory.Create(connectKey, tail == EMPTY_SHARDING_TAIL_ID ? string.Empty : tail, _serviceProvider); + dbContext = _shardingDbContextFactory.Create(connectKey, tail == EMPTY_SHARDING_TAIL_ID ? string.Empty : tail, _serviceProvider.GetService()); dbContexts.TryAdd(tail, dbContext); } diff --git a/src/ShardingCore/ShardingBootstrapper.cs b/src/ShardingCore/ShardingBootstrapper.cs index e903a2bb..7007228f 100644 --- a/src/ShardingCore/ShardingBootstrapper.cs +++ b/src/ShardingCore/ShardingBootstrapper.cs @@ -83,7 +83,7 @@ namespace ShardingCore var dbContextOptionsProvider = scope.ServiceProvider.GetService(); using var context = _shardingDbContextFactory.Create(connectKey, new ShardingDbContextOptions(dbContextOptionsProvider.GetDbContextOptions(connectKey), - string.Empty),scope.ServiceProvider); + string.Empty)); foreach (var entity in context.Model.GetEntityTypes()) { _virtualDataSourceManager.AddConnectEntities(connectKey, entity.ClrType); @@ -186,7 +186,7 @@ namespace ShardingCore var dbContextOptionsProvider = scope.ServiceProvider.GetService(); using var context = _shardingDbContextFactory.Create(shardingConfig.ConnectKey, new ShardingDbContextOptions( - dbContextOptionsProvider.GetDbContextOptions(shardingConfig.ConnectKey), string.Empty),scope.ServiceProvider); + dbContextOptionsProvider.GetDbContextOptions(shardingConfig.ConnectKey), string.Empty)); var modelCacheSyncObject = context.GetModelCacheSyncObject(); lock (modelCacheSyncObject) diff --git a/src/ShardingCore/TableCreator/ShardingTableCreator.cs b/src/ShardingCore/TableCreator/ShardingTableCreator.cs index 493ae79d..7418604f 100644 --- a/src/ShardingCore/TableCreator/ShardingTableCreator.cs +++ b/src/ShardingCore/TableCreator/ShardingTableCreator.cs @@ -56,7 +56,7 @@ namespace ShardingCore.TableCreator var dbContextOptionsProvider = serviceScope.ServiceProvider.GetService(); var virtualTable = _virtualTableManager.GetVirtualTable(connectKey,shardingEntityType); - using (var dbContext = _shardingDbContextFactory.Create(connectKey,new ShardingDbContextOptions(dbContextOptionsProvider.GetDbContextOptions(connectKey), tail),serviceScope.ServiceProvider)) + using (var dbContext = _shardingDbContextFactory.Create(connectKey,new ShardingDbContextOptions(dbContextOptionsProvider.GetDbContextOptions(connectKey), tail))) { var modelCacheSyncObject = dbContext.GetModelCacheSyncObject(); diff --git a/test/ShardingCoreTestBatch/DefaultDbContext.cs b/test/ShardingCoreTestBatch/DefaultDbContext.cs new file mode 100644 index 00000000..64c38568 --- /dev/null +++ b/test/ShardingCoreTestBatch/DefaultDbContext.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore; +using ShardingCore.DbContexts.ShardingDbContexts; +using ShardingCoreTestBatch.Domain.Maps; + +namespace ShardingCoreTestBatch +{ + /* + * @Author: xjm + * @Description: + * @Date: 2021/3/31 15:28:11 + * @Ver: 1.0 + * @Email: 326308290@qq.com + */ + public class DefaultDbContext : DbContext, IShardingTableDbContext + { + public DefaultDbContext(DbContextOptions options) : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.ApplyConfiguration(new SysUserModMap()); + } + + public string ModelChangeKey { get; set; } + } +} diff --git a/test/ShardingCoreTestBatch/Domain/Entities/SysUserMod.cs b/test/ShardingCoreTestBatch/Domain/Entities/SysUserMod.cs new file mode 100644 index 00000000..aeb7b784 --- /dev/null +++ b/test/ShardingCoreTestBatch/Domain/Entities/SysUserMod.cs @@ -0,0 +1,29 @@ +using ShardingCore.Core; + +namespace ShardingCoreTestBatch.Domain.Entities +{ +/* +* @Author: xjm +* @Description: +* @Date: Thursday, 14 January 2021 15:36:43 +* @Email: 326308290@qq.com +*/ + public class SysUserMod:IShardingTable + { + /// + /// 用户Id用于分表 + /// + [ShardingTableKey(TailPrefix = "_")] + public string Id { get; set; } + /// + /// 用户名称 + /// + public string Name { get; set; } + /// + /// 用户姓名 + /// + public int Age { get; set; } + public int AgeGroup { get; set; } + + } +} \ No newline at end of file diff --git a/test/ShardingCoreTestBatch/Domain/Maps/SysUserModMap.cs b/test/ShardingCoreTestBatch/Domain/Maps/SysUserModMap.cs new file mode 100644 index 00000000..81f03f6b --- /dev/null +++ b/test/ShardingCoreTestBatch/Domain/Maps/SysUserModMap.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using ShardingCoreTestBatch.Domain.Entities; + +namespace ShardingCoreTestBatch.Domain.Maps +{ +/* +* @Author: xjm +* @Description: +* @Date: Thursday, 14 January 2021 15:37:33 +* @Email: 326308290@qq.com +*/ + public class SysUserModMap:IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(o => o.Id); + builder.Property(o => o.Id).IsRequired().HasMaxLength(128); + builder.Property(o => o.Name).HasMaxLength(128); + builder.ToTable(nameof(SysUserMod)); + } + } +} \ No newline at end of file diff --git a/test/ShardingCoreTestBatch/ShardingCoreTestBatch.csproj b/test/ShardingCoreTestBatch/ShardingCoreTestBatch.csproj new file mode 100644 index 00000000..0cf9a074 --- /dev/null +++ b/test/ShardingCoreTestBatch/ShardingCoreTestBatch.csproj @@ -0,0 +1,30 @@ + + + + net5.0 + 9.0 + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/test/ShardingCoreTestBatch/ShardingTest.cs b/test/ShardingCoreTestBatch/ShardingTest.cs new file mode 100644 index 00000000..36df9015 --- /dev/null +++ b/test/ShardingCoreTestBatch/ShardingTest.cs @@ -0,0 +1,58 @@ +using System; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using ShardingCore.Core.VirtualRoutes.TableRoutes.RoutingRuleEngine; +using ShardingCore.DbContexts.VirtualDbContexts; +using ShardingCore.Extensions; +using ShardingCoreTestBatch.Domain.Entities; +using Xunit; + +namespace ShardingCoreTestBatch +{ +/* +* @Author: xjm +* @Description: +* @Date: Friday, 15 January 2021 17:22:10 +* @Email: 326308290@qq.com +*/ + public class ShardingTest + { + private readonly IVirtualDbContext _virtualDbContext; + private readonly IRoutingRuleEngineFactory _routingRuleEngineFactory; + + public ShardingTest(IVirtualDbContext virtualDbContext,IRoutingRuleEngineFactory routingRuleEngineFactory) + { + _virtualDbContext = virtualDbContext; + _routingRuleEngineFactory = routingRuleEngineFactory; + } + + //[Fact] + //public async Task Route_TEST() + //{ + // var queryable1 = _virtualDbContext.Set().Where(o=>o.Id=="339"); + // var routeResults1 = _routingRuleEngineFactory.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); + // 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_Test() + { + var startNew = Stopwatch.StartNew(); startNew.Start(); + var mods = await _virtualDbContext.Set().Where(o=>o.Age== 7601935).ToShardingListAsync(); + startNew.Stop(); + var x = startNew.ElapsedMilliseconds; + Console.WriteLine(mods.Count); + } + + } +} \ No newline at end of file diff --git a/test/ShardingCoreTestBatch/Shardings/SysUserModVirtualTableRoute.cs b/test/ShardingCoreTestBatch/Shardings/SysUserModVirtualTableRoute.cs new file mode 100644 index 00000000..3100e056 --- /dev/null +++ b/test/ShardingCoreTestBatch/Shardings/SysUserModVirtualTableRoute.cs @@ -0,0 +1,19 @@ +using ShardingCore.VirtualRoutes.Mods; +using ShardingCoreTestBatch.Domain.Entities; + +namespace ShardingCoreTestBatch.Shardings +{ +/* +* @Author: xjm +* @Description: +* @Date: Thursday, 14 January 2021 15:39:27 +* @Email: 326308290@qq.com +*/ + public class SysUserModVirtualTableRoute : AbstractSimpleShardingModKeyStringVirtualTableRoute + { + public SysUserModVirtualTableRoute() : base(2,15) + { + } + + } +} \ No newline at end of file diff --git a/test/ShardingCoreTestBatch/Startup.cs b/test/ShardingCoreTestBatch/Startup.cs new file mode 100644 index 00000000..00437ecc --- /dev/null +++ b/test/ShardingCoreTestBatch/Startup.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using ShardingCore; +using ShardingCore.DbContexts.VirtualDbContexts; +using ShardingCore.Extensions; +using ShardingCore.SqlServer; +using ShardingCoreTestBatch.Domain.Entities; +using ShardingCoreTestBatch.Shardings; + +#if EFCORE5SQLSERVER +using ShardingCore.SqlServer; +#endif +#if EFCORE5MYSQL +using ShardingCore.MySql; +#endif + +namespace ShardingCoreTestBatch +{ +/* +* @Author: xjm +* @Description: +* @Date: Friday, 15 January 2021 15:37:46 +* @Email: 326308290@qq.com +*/ + public class Startup + { + // // 自定义 host 构建 + //public void ConfigureHost(IHostBuilder hostBuilder) + //{ + // hostBuilder + // .ConfigureAppConfiguration(builder => + // { + // builder.AddJsonFile("Configs/DbConfig.json"); + // }); + //} + + // 支持的形式: + // ConfigureServices(IServiceCollection services) + // ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext) + // ConfigureServices(HostBuilderContext hostBuilderContext, IServiceCollection services) + public void ConfigureServices(IServiceCollection services, HostBuilderContext hostBuilderContext) + { + + services.AddShardingSqlServer(o => + { + o.EnsureCreatedWithOutShardingTable = true; + o.CreateShardingTableOnStart = true; + o.AddShardingDbContextWithShardingTable("conn1", "Data Source=localhost;Initial Catalog=ShardingCoreDBBatch;Integrated Security=True", dbConfig => + { + dbConfig.AddShardingTableRoute(); + }); + //o.AddDataSourceVirtualRoute<>(); + + }); + //services.AddShardingSqlServer(o => + //{ + // o.ConnectionString = hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]; + // o.AddSharding(); + // o.AddSharding(); + // o.UseShardingCoreConfig((provider, config) => + // { + // config.EnsureCreated = true; + // config.CreateShardingTableOnStart = true; + // }); + //}); + } + + // 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法 + public void Configure(IServiceProvider serviceProvider) + { + var shardingBootstrapper = serviceProvider.GetService(); + shardingBootstrapper.Start(); + // 有一些测试数据要初始化可以放在这里 + InitData(serviceProvider).GetAwaiter().GetResult(); + } + + /// + /// 添加种子数据 + /// + /// + /// + private async Task InitData(IServiceProvider serviceProvider) + { + using (var scope = serviceProvider.CreateScope()) + { + var virtualDbContext = scope.ServiceProvider.GetService(); + if (!await virtualDbContext.Set().ShardingAnyAsync(o => true)) + { + var ids = Enumerable.Range(1, 9000000); + var userMods = new List(); + foreach (var id in ids) + { + userMods.Add(new SysUserMod() + { + Id = id.ToString(), + Age = id, + Name = $"name_{id}", + AgeGroup=Math.Abs(id%10) + }); + + } + + var shardingBatchInsertEntry = virtualDbContext.BulkInsert(userMods); + shardingBatchInsertEntry.BatchGroups.ForEach(g => + { + g.Key.BulkInsert(g.Value); + }); + + await virtualDbContext.SaveChangesAsync(); + } + } + } + } +} \ No newline at end of file