From 354f623944fb56c3bfd99a1e1f760ad7cd4ec182 Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Wed, 9 Nov 2022 15:32:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DExecuteUpdate=20Combine=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ValuesController.cs | 17 ++++++++++ .../Sample.SqlServer/Sample.SqlServer.csproj | 9 +++--- ...ShardingSqlServerMigrationsSqlGenerator.cs | 32 +++++++++++++++++++ samples/Sample.SqlServer/Startup.cs | 12 ++++--- ...lMergeSqlServerQuerySqlGeneratorFactory.cs | 17 +++++++--- .../ExecuteUpdateQueryableCombine.cs | 2 +- .../ShardingCore.2_6/ShardingCore.2_6.csproj | 3 -- test/ShardingCore.Test/ShardingTest.cs | 2 +- test/ShardingCore.Test/Startup.cs | 8 ++--- 9 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 samples/Sample.SqlServer/Shardings/ShardingSqlServerMigrationsSqlGenerator.cs diff --git a/samples/Sample.SqlServer/Controllers/ValuesController.cs b/samples/Sample.SqlServer/Controllers/ValuesController.cs index 1f128edf..6fb6b304 100644 --- a/samples/Sample.SqlServer/Controllers/ValuesController.cs +++ b/samples/Sample.SqlServer/Controllers/ValuesController.cs @@ -390,6 +390,23 @@ namespace Sample.SqlServer.Controllers .FirstOrDefaultAsync(); return Ok(); } + [HttpGet] + public async Task Get8() + + { + + + var resultx112331tt2 = await _defaultTableDbContext.Set().Where(o => o.Id == "3").FirstOrDefaultAsync(); + var xx=await _defaultTableDbContext.Set().Where(o => o.Id == "3") + .ExecuteUpdateAsync( + s => s.SetProperty(b => b.Name, b => b.Name + "1")); + var xx1 = await _defaultTableDbContext.Set().Where(o => o.Name == "name_3") + .ExecuteUpdateAsync( + s => s.SetProperty(b => b.Age, b => b.Age + 1)); + + + return Ok(); + } } } diff --git a/samples/Sample.SqlServer/Sample.SqlServer.csproj b/samples/Sample.SqlServer/Sample.SqlServer.csproj index 47eec57f..f4d2da32 100644 --- a/samples/Sample.SqlServer/Sample.SqlServer.csproj +++ b/samples/Sample.SqlServer/Sample.SqlServer.csproj @@ -1,4 +1,4 @@ - + net6.0 @@ -7,16 +7,15 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + diff --git a/samples/Sample.SqlServer/Shardings/ShardingSqlServerMigrationsSqlGenerator.cs b/samples/Sample.SqlServer/Shardings/ShardingSqlServerMigrationsSqlGenerator.cs new file mode 100644 index 00000000..9b2a9e9f --- /dev/null +++ b/samples/Sample.SqlServer/Shardings/ShardingSqlServerMigrationsSqlGenerator.cs @@ -0,0 +1,32 @@ +using System.Linq; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Update; +using ShardingCore.Core.RuntimeContexts; +using ShardingCore.Helpers; + +namespace Sample.SqlServer.Shardings +{ + public class ShardingSqlServerMigrationsSqlGenerator:SqlServerMigrationsSqlGenerator + { + private readonly IShardingRuntimeContext _shardingRuntimeContext; + + public ShardingSqlServerMigrationsSqlGenerator(IShardingRuntimeContext shardingRuntimeContext,MigrationsSqlGeneratorDependencies dependencies, ICommandBatchPreparer commandBatchPreparer) : base(dependencies, commandBatchPreparer) + { + _shardingRuntimeContext = shardingRuntimeContext; + } + protected override void Generate( + MigrationOperation operation, + IModel model, + MigrationCommandListBuilder builder) + { + var oldCmds = builder.GetCommandList().ToList(); + base.Generate(operation, model, builder); + var newCmds = builder.GetCommandList().ToList(); + var addCmds = newCmds.Where(x => !oldCmds.Contains(x)).ToList(); + + MigrationHelper.Generate(_shardingRuntimeContext, operation, builder, Dependencies.SqlGenerationHelper, addCmds); + } + } +} diff --git a/samples/Sample.SqlServer/Startup.cs b/samples/Sample.SqlServer/Startup.cs index 049c6480..49046fc8 100644 --- a/samples/Sample.SqlServer/Startup.cs +++ b/samples/Sample.SqlServer/Startup.cs @@ -56,8 +56,14 @@ namespace Sample.SqlServer builder.UseLoggerFactory(loggerFactory).UseUnionAllMerge(); }); op.AddDefaultDataSource("A", - "Data Source=localhost;Initial Catalog=ShardingCoreDBXA;Integrated Security=True;" + "Data Source=localhost;Initial Catalog=ShardingCoreDBXA;Integrated Security=True;TrustServerCertificate=True;" ); + op.UseShardingMigrationConfigure(o => + { + o.ReplaceService(); + }); + + }).AddServiceConfigure(s => { s.AddSingleton(sp => LoggerFactory.Create(builder => @@ -121,9 +127,7 @@ namespace Sample.SqlServer using (var serviceScope = app.ApplicationServices.CreateScope()) { var defaultShardingDbContext = serviceScope.ServiceProvider.GetService(); - - var migrator = defaultShardingDbContext.GetService(); - migrator.Migrate("InitialCreate"); + defaultShardingDbContext.Database.Migrate(); } app.ApplicationServices.UseAutoTryCompensateTable(); diff --git a/samples/Sample.SqlServer/UnionAllMerge/UnionAllMergeSqlServerQuerySqlGeneratorFactory.cs b/samples/Sample.SqlServer/UnionAllMerge/UnionAllMergeSqlServerQuerySqlGeneratorFactory.cs index b13e82a6..41273c6e 100644 --- a/samples/Sample.SqlServer/UnionAllMerge/UnionAllMergeSqlServerQuerySqlGeneratorFactory.cs +++ b/samples/Sample.SqlServer/UnionAllMerge/UnionAllMergeSqlServerQuerySqlGeneratorFactory.cs @@ -16,16 +16,18 @@ namespace Sample.SqlServer.UnionAllMerge public class UnionAllMergeSqlServerQuerySqlGeneratorFactory : IQuerySqlGeneratorFactory, IUnionAllMergeQuerySqlGeneratorFactory where TShardingDbContext : DbContext, IShardingDbContext { + private readonly IRelationalTypeMappingSource _typeMappingSource; private readonly IShardingRuntimeContext _shardingRuntimeContext; - public UnionAllMergeSqlServerQuerySqlGeneratorFactory(QuerySqlGeneratorDependencies dependencies,IShardingRuntimeContext shardingRuntimeContext) + public UnionAllMergeSqlServerQuerySqlGeneratorFactory(QuerySqlGeneratorDependencies dependencies, IRelationalTypeMappingSource typeMappingSource, IShardingRuntimeContext shardingRuntimeContext) { + _typeMappingSource = typeMappingSource; _shardingRuntimeContext = shardingRuntimeContext; Dependencies = dependencies; } public QuerySqlGeneratorDependencies Dependencies { get; } - public QuerySqlGenerator Create() => new UnionAllMergeSqlServerQuerySqlGenerator(Dependencies,_shardingRuntimeContext); + public QuerySqlGenerator Create() => new UnionAllMergeSqlServerQuerySqlGenerator(Dependencies, _typeMappingSource, _shardingRuntimeContext); } public class UnionAllMergeSqlServerQuerySqlGenerator : SqlServerQuerySqlGenerator @@ -35,13 +37,19 @@ namespace Sample.SqlServer.UnionAllMerge private readonly IEntityMetadataManager _entityMetadataManager; private readonly IUnionAllMergeManager _unionAllMergeManager; - public UnionAllMergeSqlServerQuerySqlGenerator(QuerySqlGeneratorDependencies dependencies,IShardingRuntimeContext shardingRuntimeContext) - : base(dependencies) + public UnionAllMergeSqlServerQuerySqlGenerator(QuerySqlGeneratorDependencies dependencies, IRelationalTypeMappingSource typeMappingSource, IShardingRuntimeContext shardingRuntimeContext) : base(dependencies, typeMappingSource) { _shardingRuntimeContext = shardingRuntimeContext; _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); _unionAllMergeManager = shardingRuntimeContext.GetRequiredService(); } + //public UnionAllMergeSqlServerQuerySqlGenerator(QuerySqlGeneratorDependencies dependencies,IShardingRuntimeContext shardingRuntimeContext) + // : base(dependencies) + //{ + // _shardingRuntimeContext = shardingRuntimeContext; + // _entityMetadataManager = shardingRuntimeContext.GetEntityMetadataManager(); + // _unionAllMergeManager = shardingRuntimeContext.GetRequiredService(); + //} protected override Expression VisitTable(TableExpression tableExpression) { @@ -89,5 +97,6 @@ namespace Sample.SqlServer.UnionAllMerge var result = base.VisitTable(tableExpression); return result; } + } } diff --git a/src/ShardingCore/Sharding/ShardingExecutors/QueryableCombines/ExecuteUpdateQueryableCombine.cs b/src/ShardingCore/Sharding/ShardingExecutors/QueryableCombines/ExecuteUpdateQueryableCombine.cs index 9a89f4ca..a71fb986 100644 --- a/src/ShardingCore/Sharding/ShardingExecutors/QueryableCombines/ExecuteUpdateQueryableCombine.cs +++ b/src/ShardingCore/Sharding/ShardingExecutors/QueryableCombines/ExecuteUpdateQueryableCombine.cs @@ -12,7 +12,7 @@ namespace ShardingCore.Sharding.ShardingExecutors.QueryableCombines { public override IQueryable DoCombineQueryable(IQueryable queryable, Expression secondExpression, IQueryCompilerContext queryCompilerContext) { - if (!(secondExpression is ConstantExpression)) + if (!(secondExpression is UnaryExpression where && where.Operand is LambdaExpression lambdaExpression)) { throw new ShardingCoreInvalidOperationException(queryCompilerContext.GetQueryExpression().ShardingPrint()); } diff --git a/src2_6/ShardingCore.2_6/ShardingCore.2_6.csproj b/src2_6/ShardingCore.2_6/ShardingCore.2_6.csproj index f14d1659..9da7a59f 100644 --- a/src2_6/ShardingCore.2_6/ShardingCore.2_6.csproj +++ b/src2_6/ShardingCore.2_6/ShardingCore.2_6.csproj @@ -95,7 +95,4 @@ - - - diff --git a/test/ShardingCore.Test/ShardingTest.cs b/test/ShardingCore.Test/ShardingTest.cs index 458f67c0..247f2279 100644 --- a/test/ShardingCore.Test/ShardingTest.cs +++ b/test/ShardingCore.Test/ShardingTest.cs @@ -282,7 +282,7 @@ namespace ShardingCore.Test { _virtualDbContext.ReadWriteSeparationReadOnly(); var connectionString1 = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName, true); - Assert.Equal(connectionString1, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;"); + Assert.Equal(connectionString1, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;TrustServerCertificate=True;"); _virtualDbContext.ReadWriteSeparationWriteOnly(); } //[Fact] diff --git a/test/ShardingCore.Test/Startup.cs b/test/ShardingCore.Test/Startup.cs index 46769a79..d8586f51 100644 --- a/test/ShardingCore.Test/Startup.cs +++ b/test/ShardingCore.Test/Startup.cs @@ -81,14 +81,14 @@ namespace ShardingCore.Test }); //添加默认数据源 op.AddDefaultDataSource("A", - "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;"); + "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;TrustServerCertificate=True;"); //添加额外数据源 op.AddExtraDataSource(sp => { return new Dictionary() { - { "B", "Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;" }, - { "C", "Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;" }, + { "B", "Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;TrustServerCertificate=True;" }, + { "C", "Data Source=localhost;Initial Catalog=ShardingCoreDBC;Integrated Security=True;TrustServerCertificate=True;" }, }; }); //添加读写分离 @@ -99,7 +99,7 @@ namespace ShardingCore.Test { "A", new HashSet() { - "Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;" + "Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;TrustServerCertificate=True;" } } };