diff --git a/.gitignore b/.gitignore
index c1338bd1..c9c84563 100644
--- a/.gitignore
+++ b/.gitignore
@@ -343,4 +343,4 @@ healthchecksdb
/src/Bd.ShopRent.Api/Properties/launchSettings.json
/src/Bd.ShopRent.DTO/__autoDTOConfig.json
/src/Bd.ShopRent.DTO/Bd.ShopRent.Dto.csproj
-/test/ShardingCore.Test50/Configs/*
+MacDbConfig.json
diff --git a/README.md b/README.md
index 692a439b..5fc0342a 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ Release | EF Core | .NET Standard | .NET (Core)
### 数据库支持
数据库 | 是否支持 | 支持情况
--- | --- | ---
-SqlServer | 是 | 80%近乎完美
+SqlServer | 是 | 90%近乎完美
MySql |支持 | 未测试
PostgreSql | 支持 | 未测试
SQLite | 支持 | 未测试
@@ -40,6 +40,7 @@ Oracle | 支持 | 未测试
- [自动建表](#自动建表)
- [事务](#事务)
- [批量操作](#批量操作)
+ - [读写分离](#读写分离)
- [注意事项](#注意事项)
- [计划(Future)](#计划)
- [最后](#最后)
@@ -94,7 +95,11 @@ Oracle | 支持 | 未测试
## 安装
```xml
-
+
+or
+
+or
+
```
## 配置
@@ -154,7 +159,7 @@ Oracle | 支持 | 未测试
modelBuilder.ApplyConfiguration(new SysTestMap());
}
- public string ModelChangeKey { get; set; }
+ public IRouteTail RouteTail { get; set; }
}
```
@@ -196,7 +201,6 @@ Oracle | 支持 | 未测试
{
op.EnsureCreatedWithOutShardingTable = true;
op.CreateShardingTableOnStart = true;
- //不支持mars额外加一条字符串的
op.UseShardingOptionsBuilder(
(connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger),
builder => builder.UseSqlServer("Data Source=localhost;Initial Catalog=ShardingCoreDBxx2;Integrated Security=True;").UseLoggerFactory(efLogger));
@@ -308,6 +312,22 @@ AbstractSimpleShardingYearKeyLongVirtualTableRoute |按时间戳 |yyyy | `>,>=,<
tran.commit()
```
+## 读写分离
+该框架目前已经支持单node的读写分离,后续框架将支持多node的读
+
+```c#
+
+ services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"])
+ ,op =>
+ {
+ op.EnsureCreatedWithOutShardingTable = true;
+ op.CreateShardingTableOnStart = true;
+ op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer("write db connection string").UseLoggerFactory(efLogger),
+ (conStr,builder)=> builder.UseSqlServer("read db connection string").UseLoggerFactory(efLogger));
+ op.AddShardingTableRoute();
+ op.AddShardingTableRoute();
+ });
+```
# 注意事项
该库的追踪是基于adonet的MARS(MultipleActiveResultSets=True;)所以基本不支持该特性的无法支持完美追踪
diff --git a/samples/Sample.SqlServer/Startup.cs b/samples/Sample.SqlServer/Startup.cs
index c7983613..a2a101f6 100644
--- a/samples/Sample.SqlServer/Startup.cs
+++ b/samples/Sample.SqlServer/Startup.cs
@@ -31,7 +31,7 @@ namespace Sample.SqlServer
op.EnsureCreatedWithOutShardingTable = true;
op.CreateShardingTableOnStart = true;
op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger),
- builder => builder.UseSqlServer("Data Source=localhost;Initial Catalog=ShardingCoreDBxx2;Integrated Security=True;").UseLoggerFactory(efLogger));
+ (conStr,builder) => builder.UseSqlServer(conStr).UseLoggerFactory(efLogger));
op.AddShardingTableRoute();
});
////不支持MARS不支持追踪的
diff --git a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs
index c18e262f..f7528579 100644
--- a/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs
+++ b/samples/Samples.AbpSharding/AbstractShardingAbpDbContext.cs
@@ -65,7 +65,8 @@ namespace Samples.AbpSharding
private DbContextOptions CreateMonopolyDbContextOptions()
{
var dbContextOptionBuilder = CreateDbContextOptionBuilder();
- _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(dbContextOptionBuilder);
+ var connectionString = Database.GetConnectionString();
+ _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(connectionString,dbContextOptionBuilder);
return dbContextOptionBuilder.Options;
}
diff --git a/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs b/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs
index d00d1e44..b77ffd82 100644
--- a/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs
+++ b/src/ShardingCore/IShardingDbContextOptionsBuilderConfig.cs
@@ -17,6 +17,6 @@ namespace ShardingCore
{
Type ShardingDbContextType { get; }
DbContextOptionsBuilder UseDbContextOptionsBuilder(DbConnection dbConnection, DbContextOptionsBuilder dbContextOptionsBuilder);
- DbContextOptionsBuilder UseDbContextOptionsBuilder(DbContextOptionsBuilder dbContextOptionsBuilder);
+ DbContextOptionsBuilder UseDbContextOptionsBuilder(string connectionString,DbContextOptionsBuilder dbContextOptionsBuilder);
}
}
diff --git a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs
index 3fab56be..b16ef452 100644
--- a/src/ShardingCore/Sharding/AbstractShardingDbContext.cs
+++ b/src/ShardingCore/Sharding/AbstractShardingDbContext.cs
@@ -77,7 +77,8 @@ namespace ShardingCore.Sharding
private DbContextOptions CreateMonopolyDbContextOptions()
{
var dbContextOptionBuilder = CreateDbContextOptionBuilder();
- _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(dbContextOptionBuilder);
+ var connectionString = Database.GetDbConnection().ConnectionString;
+ _shardingDbContextOptionsBuilderConfig.UseDbContextOptionsBuilder(connectionString,dbContextOptionBuilder);
return dbContextOptionBuilder.Options;
}
diff --git a/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs b/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs
index 5e29152b..535a5e94 100644
--- a/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs
+++ b/src/ShardingCore/Sharding/ShardingDbContextOptionsBuilderConfig.cs
@@ -16,13 +16,13 @@ namespace ShardingCore.Sharding
*/
public class ShardingDbContextOptionsBuilderConfig : IShardingDbContextOptionsBuilderConfig where TShardingDbContext : DbContext, IShardingDbContext
{
- public ShardingDbContextOptionsBuilderConfig(Action sameConnectionDbContextOptionsCreator, Action defaultQueryDbContextOptionsCreator)
+ public ShardingDbContextOptionsBuilderConfig(Action sameConnectionDbContextOptionsCreator, Action defaultQueryDbContextOptionsCreator)
{
SameConnectionDbContextOptionsCreator = sameConnectionDbContextOptionsCreator;
DefaultQueryDbContextOptionsCreator = defaultQueryDbContextOptionsCreator;
}
public Action SameConnectionDbContextOptionsCreator { get; }
- public Action DefaultQueryDbContextOptionsCreator { get; }
+ public Action DefaultQueryDbContextOptionsCreator { get; }
public Type ShardingDbContextType => typeof(TShardingDbContext);
public DbContextOptionsBuilder UseDbContextOptionsBuilder(DbConnection dbConnection, DbContextOptionsBuilder dbContextOptionsBuilder)
@@ -32,9 +32,9 @@ namespace ShardingCore.Sharding
return dbContextOptionsBuilder;
}
- public DbContextOptionsBuilder UseDbContextOptionsBuilder(DbContextOptionsBuilder dbContextOptionsBuilder)
+ public DbContextOptionsBuilder UseDbContextOptionsBuilder(string connectionString,DbContextOptionsBuilder dbContextOptionsBuilder)
{
- DefaultQueryDbContextOptionsCreator(dbContextOptionsBuilder);
+ DefaultQueryDbContextOptionsCreator(connectionString,dbContextOptionsBuilder);
dbContextOptionsBuilder.UseInnerDbContextSharding();
return dbContextOptionsBuilder;
}
diff --git a/src/ShardingCore/ShardingConfigOption.cs b/src/ShardingCore/ShardingConfigOption.cs
index f2a0843f..f8ae5cdf 100644
--- a/src/ShardingCore/ShardingConfigOption.cs
+++ b/src/ShardingCore/ShardingConfigOption.cs
@@ -26,14 +26,14 @@ namespace ShardingCore
private readonly Dictionary _virtualRoutes = new Dictionary();
public Action SameConnectionConfigure { get; set; }
- public Action DefaultQueryConfigure { get; set; }
+ public Action DefaultQueryConfigure { get; set; }
///
/// 配置数据库分表查询和保存时的DbContext创建方式
///
/// DbConnection下如何配置因为不同的DbContext支持事务需要使用同一个DbConnection
/// 默认查询DbContext创建的配置
- public void UseShardingOptionsBuilder(Action sameConnectionConfigure, Action defaultQueryConfigure = null)
+ public void UseShardingOptionsBuilder(Action sameConnectionConfigure, Action defaultQueryConfigure = null)
{
SameConnectionConfigure = sameConnectionConfigure ?? throw new ArgumentNullException(nameof(sameConnectionConfigure));
DefaultQueryConfigure = defaultQueryConfigure ?? throw new ArgumentNullException(nameof(defaultQueryConfigure));
diff --git a/test/ShardingCore.Test50/Configs/DbConfig.json b/test/ShardingCore.Test50/Configs/DbConfig.json
index f305cd6d..f131dbfd 100644
--- a/test/ShardingCore.Test50/Configs/DbConfig.json
+++ b/test/ShardingCore.Test50/Configs/DbConfig.json
@@ -1,5 +1,9 @@
{
"SqlServer": {
"ConnectionString": "Data Source=localhost;Initial Catalog=ShardingCoreDB;Integrated Security=True;"
+ },
+ "MySql": {
+ "ConnectionString": "server=127.0.0.1;port=3306;user=root;password=root;database=ShardingCoreDB;sslMode=None;"
}
+
}
\ No newline at end of file
diff --git a/test/ShardingCore.Test50/ShardingCore.Test50.csproj b/test/ShardingCore.Test50/ShardingCore.Test50.csproj
index c31970f9..69a92fa1 100644
--- a/test/ShardingCore.Test50/ShardingCore.Test50.csproj
+++ b/test/ShardingCore.Test50/ShardingCore.Test50.csproj
@@ -9,6 +9,7 @@
+
diff --git a/test/ShardingCore.Test50/Startup.cs b/test/ShardingCore.Test50/Startup.cs
index e1244418..24d18235 100644
--- a/test/ShardingCore.Test50/Startup.cs
+++ b/test/ShardingCore.Test50/Startup.cs
@@ -51,13 +51,23 @@ namespace ShardingCore.Test50
services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"])
,op =>
{
- op.EnsureCreatedWithOutShardingTable = false;
- op.CreateShardingTableOnStart = false;
+ op.EnsureCreatedWithOutShardingTable = true;
+ op.CreateShardingTableOnStart = true;
op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger),
- builder=> builder.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]).UseLoggerFactory(efLogger));
+ (conStr,builder)=> builder.UseSqlServer(conStr).UseLoggerFactory(efLogger));
op.AddShardingTableRoute();
op.AddShardingTableRoute();
});
+ // services.AddShardingDbContext(o => o.UseMySql(hostBuilderContext.Configuration.GetSection("MySql")["ConnectionString"],new MySqlServerVersion("5.7.15"))
+ // ,op =>
+ // {
+ // op.EnsureCreatedWithOutShardingTable = true;
+ // op.CreateShardingTableOnStart = true;
+ // op.UseShardingOptionsBuilder((connection, builder) => builder.UseMySql(connection,new MySqlServerVersion("5.7.15")).UseLoggerFactory(efLogger),
+ // (conStr,builder)=> builder.UseMySql(conStr,new MySqlServerVersion("5.7.15")).UseLoggerFactory(efLogger));
+ // op.AddShardingTableRoute();
+ // op.AddShardingTableRoute();
+ // });
}
// 可以添加要用到的方法参数,会自动从注册的服务中获取服务实例,类似于 asp.net core 里 Configure 方法
diff --git a/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj b/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj
index 41ae8941..8fbc62be 100644
--- a/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj
+++ b/test/ShardingCore.Test50_2x/ShardingCore.Test50_2x.csproj
@@ -23,7 +23,6 @@
PreserveNewest
-
diff --git a/test/ShardingCore.Test50_2x/Startup.cs b/test/ShardingCore.Test50_2x/Startup.cs
index b08fceae..d509627a 100644
--- a/test/ShardingCore.Test50_2x/Startup.cs
+++ b/test/ShardingCore.Test50_2x/Startup.cs
@@ -44,10 +44,10 @@ namespace ShardingCore.Test50_2x
services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"])
,op =>
{
- op.EnsureCreatedWithOutShardingTable = false;
- op.CreateShardingTableOnStart = false;
+ op.EnsureCreatedWithOutShardingTable = true;
+ op.CreateShardingTableOnStart = true;
op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger),
- builder=> builder.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]).UseLoggerFactory(efLogger));
+ (conStr,builder)=> builder.UseSqlServer(conStr).UseLoggerFactory(efLogger));
op.AddShardingTableRoute();
op.AddShardingTableRoute();
});
diff --git a/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj b/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj
index 43531edf..3235172d 100644
--- a/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj
+++ b/test/ShardingCore.Test50_3x/ShardingCore.Test50_3x.csproj
@@ -22,7 +22,6 @@
PreserveNewest
-
diff --git a/test/ShardingCore.Test50_3x/Startup.cs b/test/ShardingCore.Test50_3x/Startup.cs
index 4e09c77f..53d8f78f 100644
--- a/test/ShardingCore.Test50_3x/Startup.cs
+++ b/test/ShardingCore.Test50_3x/Startup.cs
@@ -44,10 +44,10 @@ namespace ShardingCore.Test50_3x
services.AddShardingDbContext(o => o.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"])
,op =>
{
- op.EnsureCreatedWithOutShardingTable = false;
- op.CreateShardingTableOnStart = false;
+ op.EnsureCreatedWithOutShardingTable = true;
+ op.CreateShardingTableOnStart = true;
op.UseShardingOptionsBuilder((connection, builder) => builder.UseSqlServer(connection).UseLoggerFactory(efLogger),
- builder=> builder.UseSqlServer(hostBuilderContext.Configuration.GetSection("SqlServer")["ConnectionString"]).UseLoggerFactory(efLogger));
+ (conStr,builder)=> builder.UseSqlServer(conStr).UseLoggerFactory(efLogger));
op.AddShardingTableRoute();
op.AddShardingTableRoute();
});