修复读写分离bug,发布x.3.1.50

This commit is contained in:
xuejiaming 2021-11-24 16:51:51 +08:00
parent 4c1267cf83
commit 50ae6906ab
43 changed files with 777 additions and 97 deletions

View File

@ -13,7 +13,10 @@
## 📚 Documentation
[中文文档](https://xuejmnet.github.io/sharding-core-doc/) | [English Document](https://xuejmnet.github.io/sharding-core-doc/en/)
[中文文档Github](https://xuejmnet.github.io/sharding-core-doc/) | [English Document Github](https://xuejmnet.github.io/sharding-core-doc/en/)
[中文文档Gitee](https://xuejm.gitee.io/sharding-core-doc/) | [English Document Gitee](https://xuejm.gitee.io/sharding-core-doc/en/)
### 依赖
Release | EF Core | .NET | .NET (Core)

View File

@ -1,9 +1,9 @@
:start
::定义版本
set EFCORE2=2.3.1.49
set EFCORE3=3.3.1.49
set EFCORE5=5.3.1.49
set EFCORE6=6.3.1.49
set EFCORE2=2.3.1.50
set EFCORE3=3.3.1.50
set EFCORE5=5.3.1.50
set EFCORE6=6.3.1.50
::删除所有bin与obj下的文件
@echo off

View File

@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ShardingCore.Core.ShardingEnumerableQueries
{
public interface IShardingEmptyEnumerableQuery
{
IQueryable EmptyQueryable();
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace ShardingCore.Core.ShardingEnumerableQueries
{
internal class ShardingEmptyEnumerableQuery<TSource>: IShardingEmptyEnumerableQuery
{
private readonly Expression<Func<TSource, bool>> _whereExpression;
public ShardingEmptyEnumerableQuery(Expression<Func<TSource,bool>> whereExpression)
{
_whereExpression = whereExpression;
}
public IQueryable EmptyQueryable()
{
return new List<TSource>(0).AsQueryable().Where(_whereExpression);
}
}
}

View File

@ -5,6 +5,7 @@ using System.Linq;
using System.Linq.Expressions;
using Microsoft.EntityFrameworkCore;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Core.ShardingEnumerableQueries;
using ShardingCore.Core.VirtualDatabase.VirtualDataSources.PhysicDataSources;
using ShardingCore.Core.VirtualRoutes;
using ShardingCore.Core.VirtualRoutes.DataSourceRoutes;
@ -45,7 +46,10 @@ namespace ShardingCore.Core.VirtualDatabase.VirtualDataSources
if (routeRouteConfig.UseQueryable())
return virtualDataSourceRoute.RouteWithPredicate(routeRouteConfig.GetQueryable(), true);
if (routeRouteConfig.UsePredicate())
return virtualDataSourceRoute.RouteWithPredicate((IQueryable)Activator.CreateInstance(typeof(EnumerableQuery<>).MakeGenericType(entityType), routeRouteConfig.UsePredicate()), false);
{
var shardingEmptyEnumerableQuery = (IShardingEmptyEnumerableQuery)Activator.CreateInstance(typeof(ShardingEmptyEnumerableQuery<>).MakeGenericType(entityType), routeRouteConfig.GetPredicate());
return virtualDataSourceRoute.RouteWithPredicate(shardingEmptyEnumerableQuery.EmptyQueryable(), false);
}
object shardingKeyValue = null;
if (routeRouteConfig.UseValue())
shardingKeyValue = routeRouteConfig.GetShardingKeyValue();

View File

@ -69,7 +69,7 @@ namespace ShardingCore.DIExtensions
{
services.AddTransient<IConnectionStringManager<TShardingDbContext>, ReadWriteConnectionStringManager<TShardingDbContext>>();
services.AddSingleton<IReadWriteOptions, ReadWriteOptions<TShardingDbContext>>(sp =>
services.AddSingleton<IReadWriteOptions<TShardingDbContext>, ReadWriteOptions<TShardingDbContext>>(sp =>
new ReadWriteOptions<TShardingDbContext>(
_shardingCoreConfigBuilder.ShardingConfigOption.ReadWriteDefaultPriority,
_shardingCoreConfigBuilder.ShardingConfigOption.ReadWriteDefaultEnable,

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
using System.Text;
@ -12,7 +13,8 @@ namespace ShardingCore.Exceptions
* @Ver: 1.0
* @Email: 326308290@qq.com
*/
public class ShardingCoreException: Exception
[ExcludeFromCodeCoverage]
public class ShardingCoreException : Exception
{
public ShardingCoreException(string message) : base(message)

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
@ -7,6 +8,7 @@ using System.Threading.Tasks;
namespace ShardingCore.Exceptions
{
[ExcludeFromCodeCoverage]
public class ShardingCoreInvalidOperationException: ShardingCoreException
{

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
using System.Text;
@ -12,6 +13,7 @@ namespace ShardingCore.Exceptions
* @Ver: 1.0
* @Email: 326308290@qq.com
*/
[ExcludeFromCodeCoverage]
public class ShardingCoreParallelQueryTimeOutException:ShardingCoreException
{

View File

@ -1,3 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using ShardingCore.Core.Internal.Visitors;
@ -45,12 +46,13 @@ namespace ShardingCore.Extensions
var expression = new RemoveTakeVisitor().Visit(source.Expression);
return (IQueryable<T>) source.Provider.CreateQuery(expression);
}
[ExcludeFromCodeCoverage]
internal static IQueryable<T> RemoveOrderBy<T>(this IQueryable<T> source)
{
var expression = new RemoveOrderByVisitor().Visit(source.Expression);
return (IQueryable<T>)source.Provider.CreateQuery(expression);
}
[ExcludeFromCodeCoverage]
internal static IQueryable<T> RemoveOrderByDescending<T>(this IQueryable<T> source)
{
var expression = new RemoveOrderByDescendingVisitor().Visit(source.Expression);

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using ShardingCore.Sharding.PaginationConfigurations;

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -11,6 +12,7 @@ namespace ShardingCore.Extensions
{
public static class ShardingCoreConfigBuilderExtension
{
[ExcludeFromCodeCoverage]
public static void AddEntityTryCreateTable<TEntity>(this ShardingCoreBeginOptions source) where TEntity:class
{
source.AddEntitiesTryCreateTable(typeof(TEntity));

View File

@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Text;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
namespace ShardingCore.Extensions
@ -15,6 +16,7 @@ namespace ShardingCore.Extensions
*/
public static class ShardingReadWriteExtension
{
/// <summary>
/// 设置读写分离读取写数据库
/// </summary>
@ -67,5 +69,10 @@ namespace ShardingCore.Extensions
supportShardingReadWrite.ReadWriteSeparation = readOnly;
}
}
public static void SetReadWriteSeparation(this ShardingReadWriteContext shardingReadWriteContext,int priority, bool readOnly)
{
shardingReadWriteContext.DefaultPriority = priority;
shardingReadWriteContext.DefaultReadEnable = readOnly;
}
}
}

View File

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Runtime.ExceptionServices;
using System.Text;
using System.Threading;
@ -14,6 +15,7 @@ namespace ShardingCore.Extensions
* @Ver: 1.0
* @Email: 326308290@qq.com
*/
[ExcludeFromCodeCoverage]
internal static class TaskExtension
{
/// <summary>

View File

@ -18,6 +18,7 @@
using System;
using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.Serialization;
using System.Text;
@ -205,6 +206,7 @@ namespace ShardingCore.Jobs.Cron
/// <author>Contributions from Mads Henderson</author>
/// <author>Refactoring from CronTrigger to CronExpression by Aaron Craven</author>
[Serializable]
[ExcludeFromCodeCoverage]
internal class CronExpression : ICloneable, IDeserializationCallback
{
/// <summary>
@ -1059,7 +1061,6 @@ namespace ShardingCore.Jobs.Cron
i++;
return i;
}
/// <summary>
/// Gets the cron expression string.
/// </summary>

View File

@ -16,6 +16,7 @@
*/
using System.Collections;
using System.Diagnostics.CodeAnalysis;
namespace ShardingCore.Jobs.Cron
{

View File

@ -16,6 +16,7 @@
*/
using System.Diagnostics.CodeAnalysis;
using ShardingCore.Jobs.Cron;
namespace ShardingCore.Jobs
@ -23,7 +24,7 @@ namespace ShardingCore.Jobs
/// <summary>
/// A sorted set.
/// </summary>
internal interface ISortedSet : ISet
internal interface ISortedSet : ISet
{
/// <summary>
/// Returns a portion of the list whose elements are greater than the limit object parameter.

View File

@ -17,6 +17,7 @@
using System;
using System.Collections;
using System.Diagnostics.CodeAnalysis;
namespace ShardingCore.Jobs.Cron
{
@ -24,6 +25,7 @@ namespace ShardingCore.Jobs.Cron
/// SupportClass for the TreeSet class.
/// </summary>
[Serializable]
[ExcludeFromCodeCoverage]
internal class TreeSet : ArrayList, ISortedSet
{
private readonly IComparer comparator = Comparer.Default;

View File

@ -14,7 +14,7 @@ namespace ShardingCore.Jobs
*/
internal static class DIExtension
{
public static IServiceCollection TryAddShardingJob(this IServiceCollection services)
internal static IServiceCollection TryAddShardingJob(this IServiceCollection services)
{
services.TryAddSingleton<JobRunnerService>();
services.TryAddSingleton<IJobManager, InMemoryJobManager>();

View File

@ -2,6 +2,7 @@ using Microsoft.Extensions.Logging;
using ShardingCore.Jobs.Abstaractions;
using ShardingCore.Jobs.Impls;
using System;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@ -14,6 +15,7 @@ namespace ShardingCore.Jobs
* @Date: Wednesday, 06 January 2021 13:00:11
* @Email: 326308290@qq.com
*/
[ExcludeFromCodeCoverage]
internal class JobRunnerService
{
private readonly IServiceProvider _serviceProvider;

View File

@ -13,7 +13,8 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations.Abstractions
* @Ver: 1.0
* @Email: 326308290@qq.com
*/
public interface IReadWriteOptions
public interface IReadWriteOptions<TShardingDbContext>
where TShardingDbContext : DbContext, IShardingDbContext
{
/// <summary>
/// 默认读写配置优先级
@ -25,10 +26,4 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations.Abstractions
bool ReadWriteSupport { get; }
ReadConnStringGetStrategyEnum ReadConnStringGetStrategy { get; }
}
public interface IReadWriteOptions<TShardingDbContext> : IReadWriteOptions
where TShardingDbContext : DbContext, IShardingDbContext
{
}
}

View File

@ -20,6 +20,7 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations.Abstractions
public interface IShardingConnectionStringResolver<TShardingDbContext>
where TShardingDbContext : DbContext, IShardingDbContext
{
bool ContainsReadWriteDataSourceName(string dataSourceName);
string GetConnectionString(string dataSourceName);
}
}

View File

@ -32,6 +32,11 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
}
}
public bool ContainsReadWriteDataSourceName(string dataSourceName)
{
return _connectors.ContainsKey(dataSourceName);
}
public string GetConnectionString(string dataSourceName)
{
if (!_connectors.TryGetValue(dataSourceName, out var connector))

View File

@ -22,6 +22,7 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
{
private readonly ConcurrentDictionary<string, ReadWriteRandomConnector> _connectors =
new ConcurrentDictionary<string, ReadWriteRandomConnector>();
public RandomShardingConnectionStringResolver(IEnumerable<ReadWriteRandomConnector> connectors)
{
var enumerator = connectors.GetEnumerator();
@ -31,6 +32,12 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
if (currentConnector != null)
_connectors.TryAdd(currentConnector.DataSourceName, currentConnector);
}
}
public bool ContainsReadWriteDataSourceName(string dataSourceName)
{
return _connectors.ContainsKey(dataSourceName);
}
public string GetConnectionString(string dataSourceName)

View File

@ -19,14 +19,18 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
public class ReadWriteConnectionStringManager<TShardingDbContext> : IConnectionStringManager<TShardingDbContext> where TShardingDbContext : DbContext, IShardingDbContext
{
private IShardingConnectionStringResolver<TShardingDbContext> _shardingConnectionStringResolver;
private readonly IVirtualDataSource<TShardingDbContext> _virtualDataSource;
public ReadWriteConnectionStringManager(IShardingConnectionStringResolver<TShardingDbContext> shardingConnectionStringResolver)
public ReadWriteConnectionStringManager(IShardingConnectionStringResolver<TShardingDbContext> shardingConnectionStringResolver,IVirtualDataSource<TShardingDbContext> virtualDataSource)
{
_shardingConnectionStringResolver = shardingConnectionStringResolver;
_virtualDataSource = virtualDataSource;
}
public string GetConnectionString(string dataSourceName)
{
if (!_shardingConnectionStringResolver.ContainsReadWriteDataSourceName(dataSourceName))
return _virtualDataSource.GetPhysicDataSource(dataSourceName).ConnectionString;
return _shardingConnectionStringResolver.GetConnectionString(dataSourceName);
}

View File

@ -29,6 +29,8 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
public string GetConnectionString()
{
if (_length == 1)
return _connectionStrings[0];
var newValue = Interlocked.Increment(ref _seed);
var next = (int)(newValue % _length);
if (next < 0)

View File

@ -15,7 +15,7 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
* @Email: 326308290@qq.com
*/
public class ReadWriteOptions<TShardingDbContext> : IReadWriteOptions
public class ReadWriteOptions<TShardingDbContext> : IReadWriteOptions<TShardingDbContext>
where TShardingDbContext : DbContext, IShardingDbContext
{
public ReadWriteOptions(int readWritePriority, bool readWriteSupport, ReadConnStringGetStrategyEnum readConnStringGetStrategy)

View File

@ -25,6 +25,8 @@ namespace ShardingCore.Sharding.ReadWriteConfigurations
}
public string GetConnectionString()
{
if (_length == 1)
return _connectionStrings[0];
var next = RandomHelper.Next(0, _length);
return _connectionStrings[next];

View File

@ -1,7 +1,4 @@
using System;
using ShardingCore.Core;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions;
namespace ShardingCore.VirtualRoutes.Abstractions
{

View File

@ -1,7 +1,3 @@
using ShardingCore.Core;
using ShardingCore.Core.EntityMetadatas;
using ShardingCore.Core.VirtualRoutes.TableRoutes.Abstractions;
namespace ShardingCore.VirtualRoutes.Abstractions
{
/*

View File

@ -14,7 +14,9 @@ using ShardingCore.Core.VirtualDatabase.VirtualTables;
using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test2x.Domain.Entities;
@ -32,29 +34,31 @@ namespace ShardingCore.Test2x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly ActualConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager,IConfiguration configuration,
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer,IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_connectionStringManager = new ActualConnectionStringManager<ShardingDefaultDbContext>();
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -124,7 +128,24 @@ namespace ShardingCore.Test2x
}
await _virtualDbContext.AddRangeAsync(logDays);
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -169,8 +190,10 @@ namespace ShardingCore.Test2x
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationReadOnly();
var connectionString1 = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName, true);
Assert.Equal(connectionString1, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationWriteOnly();
}
//[Fact]
//public async Task Route_TEST()
@ -838,6 +861,57 @@ namespace ShardingCore.Test2x
var z1 = await _virtualDbContext.Set<Order>().SingleAsync(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public async Task OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = await _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToListAsync();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
// [Fact]
// public async Task Group_API_Test()
// {

View File

@ -15,6 +15,7 @@ using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test2x.Domain.Entities;
@ -28,29 +29,29 @@ namespace ShardingCore.Test2x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager, IConfiguration configuration,
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer, IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -120,6 +121,24 @@ namespace ShardingCore.Test2x
}
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -161,12 +180,6 @@ namespace ShardingCore.Test2x
var compare1 = _shardingComparer.Compare(x, y, true);
Assert.True(compare1 < 0);
}
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
}
//[Fact]
//public void Route_TEST()
//{
@ -831,6 +844,47 @@ namespace ShardingCore.Test2x
var z1 = _virtualDbContext.Set<Order>().Single(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public void OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToList();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
// [Fact]
// public void Group_API_Test()
// {

View File

@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ShardingCore.Bootstrapers;
using ShardingCore.Sharding.ReadWriteConfigurations;
using ShardingCore.Test2x.Domain.Entities;
using ShardingCore.Test2x.Shardings;
@ -60,7 +61,18 @@ namespace ShardingCore.Test2x
op.AddShardingTableRoute<SysUserSalaryVirtualTableRoute>();
op.AddShardingTableRoute<OrderCreateTimeVirtualTableRoute>();
op.AddShardingTableRoute<LogDayVirtualTableRoute>();
}).End();
}).AddReadWriteSeparation(sp =>
{
return new Dictionary<string, ISet<string>>()
{
{
"A", new HashSet<string>()
{
"Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;"
}
}
};
}, ReadStrategyEnum.Loop, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime).End();
// services.AddShardingDbContext<ShardingDefaultDbContext, DefaultDbContext>(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15"))
// ,op =>
// {

View File

@ -14,7 +14,9 @@ using ShardingCore.Core.VirtualDatabase.VirtualTables;
using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test3x.Domain.Entities;
@ -32,29 +34,31 @@ namespace ShardingCore.Test3x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly ActualConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager,IConfiguration configuration,
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager,IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer,IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_connectionStringManager = new ActualConnectionStringManager<ShardingDefaultDbContext>();
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -124,7 +128,24 @@ namespace ShardingCore.Test3x
}
await _virtualDbContext.AddRangeAsync(logDays);
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -169,8 +190,10 @@ namespace ShardingCore.Test3x
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationReadOnly();
var connectionString1 = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName, true);
Assert.Equal(connectionString1, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationWriteOnly();
}
//[Fact]
//public async Task Route_TEST()
@ -838,6 +861,57 @@ namespace ShardingCore.Test3x
var z1 = await _virtualDbContext.Set<Order>().SingleAsync(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public async Task OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = await _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToListAsync();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB =await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
// [Fact]
// public async Task Group_API_Test()
// {

View File

@ -14,7 +14,9 @@ using ShardingCore.Core.VirtualDatabase.VirtualTables;
using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test3x.Domain.Entities;
@ -28,29 +30,31 @@ namespace ShardingCore.Test3x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly ActualConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager, IConfiguration configuration,
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer, IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_connectionStringManager = new ActualConnectionStringManager<ShardingDefaultDbContext>();
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -120,6 +124,24 @@ namespace ShardingCore.Test3x
}
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -164,8 +186,10 @@ namespace ShardingCore.Test3x
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
_virtualDbContext.ReadWriteSeparationReadOnly();
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName,true);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationWriteOnly();
}
//[Fact]
//public void Route_TEST()
@ -831,6 +855,57 @@ namespace ShardingCore.Test3x
var z1 = _virtualDbContext.Set<Order>().Single(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public void OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToList();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
// [Fact]
// public void Group_API_Test()
// {

View File

@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ShardingCore.Bootstrapers;
using ShardingCore.Sharding.ReadWriteConfigurations;
using ShardingCore.Test3x.Domain.Entities;
using ShardingCore.Test3x.Shardings;
@ -60,7 +61,18 @@ namespace ShardingCore.Test3x
op.AddShardingTableRoute<SysUserSalaryVirtualTableRoute>();
op.AddShardingTableRoute<OrderCreateTimeVirtualTableRoute>();
op.AddShardingTableRoute<LogDayVirtualTableRoute>();
}).End();
}).AddReadWriteSeparation(sp =>
{
return new Dictionary<string, ISet<string>>()
{
{
"A", new HashSet<string>()
{
"Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;"
}
}
};
}, ReadStrategyEnum.Loop, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime).End();
// services.AddShardingDbContext<ShardingDefaultDbContext, DefaultDbContext>(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15"))
// ,op =>
// {

View File

@ -14,7 +14,9 @@ using ShardingCore.Core.VirtualDatabase.VirtualTables;
using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test5x.Domain.Entities;
@ -32,29 +34,31 @@ namespace ShardingCore.Test5x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly ActualConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager,IConfiguration configuration,
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager,IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer,IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_connectionStringManager = new ActualConnectionStringManager<ShardingDefaultDbContext>();
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -124,7 +128,24 @@ namespace ShardingCore.Test5x
}
await _virtualDbContext.AddRangeAsync(logDays);
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -169,8 +190,10 @@ namespace ShardingCore.Test5x
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationReadOnly();
var connectionString1 = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName, true);
Assert.Equal(connectionString1, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationWriteOnly();
}
//[Fact]
//public async Task Route_TEST()
@ -838,6 +861,57 @@ namespace ShardingCore.Test5x
var z1 = await _virtualDbContext.Set<Order>().SingleAsync(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public async Task OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = await _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToListAsync();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
// [Fact]
// public async Task Group_API_Test()
// {

View File

@ -15,6 +15,7 @@ using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test5x.Domain.Entities;
@ -28,29 +29,29 @@ namespace ShardingCore.Test5x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager, IConfiguration configuration,
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer, IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -120,6 +121,24 @@ namespace ShardingCore.Test5x
}
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -161,12 +180,6 @@ namespace ShardingCore.Test5x
var compare1 = _shardingComparer.Compare(x, y, true);
Assert.True(compare1 < 0);
}
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
}
//[Fact]
//public void Route_TEST()
//{
@ -831,6 +844,57 @@ namespace ShardingCore.Test5x
var z1 = _virtualDbContext.Set<Order>().Single(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public void OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToList();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
// [Fact]
// public void Group_API_Test()
// {

View File

@ -8,6 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ShardingCore.Bootstrapers;
using ShardingCore.Sharding.ReadWriteConfigurations;
using ShardingCore.Test5x.Domain.Entities;
using ShardingCore.Test5x.Shardings;
@ -61,7 +62,18 @@ namespace ShardingCore.Test5x
op.AddShardingTableRoute<SysUserSalaryVirtualTableRoute>();
op.AddShardingTableRoute<OrderCreateTimeVirtualTableRoute>();
op.AddShardingTableRoute<LogDayVirtualTableRoute>();
}).End();
}).AddReadWriteSeparation(sp =>
{
return new Dictionary<string, ISet<string>>()
{
{
"A", new HashSet<string>()
{
"Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;"
}
}
};
}, ReadStrategyEnum.Loop, readConnStringGetStrategy: ReadConnStringGetStrategyEnum.LatestEveryTime).End();
// services.AddShardingDbContext<ShardingDefaultDbContext, DefaultDbContext>(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15"))
// ,op =>
// {

View File

@ -14,7 +14,9 @@ using ShardingCore.Core.VirtualDatabase.VirtualTables;
using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test6x.Domain.Entities;
@ -32,29 +34,31 @@ namespace ShardingCore.Test6x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly ActualConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager,IConfiguration configuration,
public ShardingTest(ShardingDefaultDbContext virtualDbContext,IShardingRouteManager shardingRouteManager, IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer,IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_connectionStringManager = new ActualConnectionStringManager<ShardingDefaultDbContext>();
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -124,8 +128,24 @@ namespace ShardingCore.Test6x
}
await _virtualDbContext.AddRangeAsync(logDays);
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext,Order>(o=>new[]{"A","B"}.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext,SysUserMod>(o=>o.Id==Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
public class SequenceClass
@ -169,8 +189,10 @@ namespace ShardingCore.Test6x
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationReadOnly();
var connectionString1 = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName, true);
Assert.Equal(connectionString1, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
_virtualDbContext.ReadWriteSeparationWriteOnly();
}
//[Fact]
//public async Task Route_TEST()
@ -838,6 +860,59 @@ namespace ShardingCore.Test6x
var z1 = await _virtualDbContext.Set<Order>().SingleAsync(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public async Task OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = await _virtualDbContext.Set<Order>().Where(o=>o.Money==1).ToListAsync();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = await _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefaultAsync();
Assert.Null(areaB);
}
}
// [Fact]
// public async Task Group_API_Test()
// {

View File

@ -15,6 +15,7 @@ using ShardingCore.Exceptions;
using ShardingCore.Extensions;
using ShardingCore.Extensions.ShardingPageExtensions;
using ShardingCore.Sharding.Abstractions;
using ShardingCore.Sharding.ReadWriteConfigurations.Abstractions;
using ShardingCore.Sharding.ShardingComparision.Abstractions;
using ShardingCore.TableCreator;
using ShardingCore.Test6x.Domain.Entities;
@ -28,29 +29,29 @@ namespace ShardingCore.Test6x
{
private readonly ShardingDefaultDbContext _virtualDbContext;
private readonly IShardingRouteManager _shardingRouteManager;
private readonly IConnectionStringManager<ShardingDefaultDbContext> _connectionStringManager;
private readonly IConfiguration _configuration;
private readonly IEntityMetadataManager<ShardingDefaultDbContext> _entityMetadataManager;
private readonly IShardingComparer<ShardingDefaultDbContext> _shardingComparer;
private readonly IVirtualDataSource<ShardingDefaultDbContext> _virtualDataSource;
private readonly IVirtualTableManager<ShardingDefaultDbContext> _virtualTableManager;
private readonly IShardingTableCreator<ShardingDefaultDbContext> _shardingTableCreator;
private readonly IShardingReadWriteManager _shardingReadWriteManager;
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConnectionStringManager<ShardingDefaultDbContext> connectionStringManager, IConfiguration configuration,
public ShardingTestSync(ShardingDefaultDbContext virtualDbContext, IShardingRouteManager shardingRouteManager, IConfiguration configuration,
IEntityMetadataManager<ShardingDefaultDbContext> entityMetadataManager,
IShardingComparer<ShardingDefaultDbContext> shardingComparer, IVirtualDataSource<ShardingDefaultDbContext> virtualDataSource,
IVirtualTableManager<ShardingDefaultDbContext> virtualTableManager,
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator)
IShardingTableCreator<ShardingDefaultDbContext> shardingTableCreator, IShardingReadWriteManager shardingReadWriteManager)
{
_virtualDbContext = virtualDbContext;
_shardingRouteManager = shardingRouteManager;
_connectionStringManager = connectionStringManager;
_configuration = configuration;
this._entityMetadataManager = entityMetadataManager;
_shardingComparer = shardingComparer;
_virtualDataSource = virtualDataSource;
_virtualTableManager = virtualTableManager;
_shardingTableCreator = shardingTableCreator;
_shardingReadWriteManager = shardingReadWriteManager;
}
[Fact]
@ -120,6 +121,24 @@ namespace ShardingCore.Test6x
}
_virtualDbContext.AddRange(logDays);
var bulkShardingExpression = _virtualDbContext.BulkShardingExpression<ShardingDefaultDbContext, Order>(o => new[] { "A", "B" }.Contains(o.Area));
Assert.Equal(2, bulkShardingExpression.Count);
Assert.True(bulkShardingExpression.ContainsKey("A"));
Assert.True(bulkShardingExpression.ContainsKey("B"));
var bulkShardingTableExpression = _virtualDbContext.BulkShardingTableExpression<ShardingDefaultDbContext, SysUserMod>(o => o.Id == Guid.NewGuid().ToString());
Assert.Equal(1, bulkShardingTableExpression.Count());
var isShardingDbContext = _virtualDbContext.IsShardingDbContext();
Assert.True(isShardingDbContext);
var isShardingTableDbContext = _virtualDbContext.IsShardingTableDbContext();
Assert.True(isShardingTableDbContext);
var shardingDbContext = _virtualDbContext.GetType().IsShardingDbContext();
Assert.True(shardingDbContext);
var shardingTableDbContext = _virtualDbContext.GetType().IsShardingTableDbContext();
Assert.True(shardingTableDbContext);
var virtualTable = _virtualTableManager.GetVirtualTable<SysUserMod>();
Assert.NotNull(virtualTable);
}
@ -161,12 +180,6 @@ namespace ShardingCore.Test6x
var compare1 = _shardingComparer.Compare(x, y, true);
Assert.True(compare1 < 0);
}
[Fact]
public void TestConnectionStringManager()
{
var connectionString = _connectionStringManager.GetConnectionString(_virtualDataSource.DefaultDataSourceName);
Assert.Equal(connectionString, "Data Source=localhost;Initial Catalog=ShardingCoreDBA;Integrated Security=True;");
}
//[Fact]
//public void Route_TEST()
//{
@ -831,6 +844,57 @@ namespace ShardingCore.Test6x
var z1 = _virtualDbContext.Set<Order>().Single(o => o.Money == 13);
Assert.Equal(z, z1);
}
[Fact]
public void OrderReadWrite()
{
//切换到只读数据库只读数据库又只配置了A数据源读取B数据源
_virtualDbContext.ReadWriteSeparationReadOnly();
var list = _virtualDbContext.Set<Order>().Where(o => o.Money == 1).ToList();
Assert.Equal(2, list.Count);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
_virtualDbContext.ReadWriteSeparationReadOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.NotNull(areaB);
}
}
using (_shardingReadWriteManager.CreateScope<ShardingDefaultDbContext>())
{
_shardingReadWriteManager.GetCurrent<ShardingDefaultDbContext>().SetReadWriteSeparation(100, true);
_virtualDbContext.ReadWriteSeparationWriteOnly();
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
using (_shardingRouteManager.CreateScope())
{
_shardingRouteManager.Current.TryCreateOrAddMustDataSource<Order>("A");
var areaB = _virtualDbContext.Set<Order>().Where(o => o.Area == "B").FirstOrDefault();
Assert.Null(areaB);
}
}
// [Fact]
// public void Group_API_Test()
// {

View File

@ -16,12 +16,10 @@ namespace ShardingCore.Test6x.Shardings
return new DateTime(2021, 1, 1);
}
public override IPaginationConfiguration<Order> CreatePaginationConfiguration()
{
return new OrderCreateTimePaginationConfiguration();
}
public override bool AutoCreateTableByTime()
{
return true;

View File

@ -8,6 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using ShardingCore.Bootstrapers;
using ShardingCore.Sharding.ReadWriteConfigurations;
using ShardingCore.Sharding.ShardingComparision;
using ShardingCore.Test6x.Domain.Entities;
using ShardingCore.Test6x.Shardings;
@ -62,7 +63,18 @@ namespace ShardingCore.Test6x
op.AddShardingTableRoute<SysUserSalaryVirtualTableRoute>();
op.AddShardingTableRoute<OrderCreateTimeVirtualTableRoute>();
op.AddShardingTableRoute<LogDayVirtualTableRoute>();
}).End();
}).AddReadWriteSeparation(sp =>
{
return new Dictionary<string, ISet<string>>()
{
{
"A", new HashSet<string>()
{
"Data Source=localhost;Initial Catalog=ShardingCoreDBB;Integrated Security=True;"
}
}
};
},ReadStrategyEnum.Loop,readConnStringGetStrategy:ReadConnStringGetStrategyEnum.LatestEveryTime).End();
// services.AddShardingDbContext<ShardingDefaultDbContext, DefaultDbContext>(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15"))
// ,op =>
// {