coldairarrow / efcore.sharding Goto Github PK
View Code? Open in Web Editor NEWDatabase Sharding For EFCore
License: Apache License 2.0
Database Sharding For EFCore
License: Apache License 2.0
下面是错误信息:
MySql.Data.MySqlClient.MySqlException
HResult=0x80004005
Message=Unknown command
Source=System.Private.CoreLib
StackTrace:
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
at System.Threading.Tasks.ValueTask1.get_Result() at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable
1.ConfiguredValueTaskAwaiter.GetResult()
at MySqlConnector.Core.ServerSession.d__69.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 495
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() at MySqlConnector.Core.ConnectionPool.<GetSessionAsync>d__10.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 72 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at MySqlConnector.Core.ConnectionPool.<GetSessionAsync>d__10.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\Core\ConnectionPool.cs:line 141 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Threading.Tasks.ValueTask
1.get_Result()
at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1.ConfiguredValueTaskAwaiter.GetResult() at MySql.Data.MySqlClient.MySqlConnection.<CreateSessionAsync>d__110.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 645 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Threading.Tasks.ValueTask
1.get_Result()
at System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable1.ConfiguredValueTaskAwaiter.GetResult() at MySql.Data.MySqlClient.MySqlConnection.<OpenAsync>d__26.MoveNext() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 312 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at MySql.Data.MySqlClient.MySqlConnection.Open() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlConnection.cs:line 280 at EFCore.Sharding.DbRepository.GetDataTableWithSql(String sql, ValueTuple
2[] parameters)
at EFCore.Sharding.DbRepository.GetListBySql[T](String sqlStr, ValueTuple`2[] parameters)
at EFCore.Program.Main(String[] args) in C:\EFCore\EFCore\Program.cs:line 22
用于需要自行拼装sql使用
请问大神能否记录SQL语句日志
如果只设置读写分离(不需要分表),如何设置呢?且从库是多个
我的需求是这样的,
四个字段, DeviceId, KeyName, KeyValue, DateTime , 我的主键是 DeviceId, KeyName,DateTime , 我想取得最新的一条数据, 该怎么写?
在事务中进行sql查询的时候,没办法查询到未提交的数据
config.SetDateSharding<Base_UnitTest>(nameof(Base_UnitTest.CreateTime), ExpandByDateMode.PerMinute, startTime);
api接口和例子工程不一样,而且配置了postgresql数据库,使用分表api后仍然会提示未安装sqlite提供器
System.InvalidOperationException: Cannot create a DbSet for 'Base_User' because this type is not included in the model for the context.
物理删除时,操作成功。当启用逻辑删除时,添加修改功能正常,删除时报如下错误。
2020-05-12 14:48:50.374 +08:00 [ERR]
MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'basevue.sysadmin' doesn't exist
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Table 'basevue.sysadmin' doesn't exist
at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask1 task) in /_/src/MySqlConnector/Core/ServerSession.cs:line 777 at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in /_/src/MySqlConnector/Core/ResultSet.cs:line 51 at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs:line 130 at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary
2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlDataReader.cs:line 391
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/CommandExecutor.cs:line 62 at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlCommand.cs:line 220 at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQueryAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.ExecuteSqlRawAsync(DatabaseFacade databaseFacade, String sql, IEnumerable
1 parameters, CancellationToken cancellationToken)
at EFCore.Sharding.DbRepository.ExecuteSqlAsync(String sql, ValueTuple2[] paramters) at EFCore.Sharding.DbRepository.UpdateWhere_SqlAsync(IQueryable source, ValueTuple
3[] values)
at EFCore.Sharding.LogicDeleteRepository.Delete_SqlAsync(IQueryable source)
at EFCore.Sharding.LogicDeleteRepository.DeleteAsync(Type type, List1 keys) at EFCore.Sharding.LogicDeleteRepository.DeleteAsync[T](List
1 keys)
at Wensaint.BaseVue.Services.BaseService2.DeleteAsync(List
1 keys) in D:\Rnd\BaseVue\Src\Wensaint.Services\BaseService.cs:line 407
at Wensaint.BaseVue.Api.CRUDApiControllerBase2.DeleteAsync(String id) in D:\Rnd\BaseVue\Src\Wensaint.Api\Controllers\ApiControllerBase.cs:line 176 at lambda_method(Closure , Object ) at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult() at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask
1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
其中sysAdmin的实体定义如下:
[Table("sys_admin")]
public class sysAdmin
{
……
}
IRepository改为IDbAccessor
避免与DDD中仓储搞混
请问可以将长Sql语句的监听接口公开,目前所有的Sql内容都统统写入日志很好,但是对于耗时较久的Sql定位不是很方便
IShardingRepository.InsertAsync异常,在控制器中执行
builder.Property(x => x.Time).HasConversion(v => v, v => DateTime.SpecifyKind(v, DateTimeKind.Local));
var dateTimeConverter = new ValueConverter<DateTime,DateTime>(
v => v,DateTimeKind.Utc));
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
{
foreach (var property in entityType.GetProperties())
{
if (property.ClrType == typeof(DateTime) || property.ClrType == typeof(DateTime?))
property.SetValueConverter(dateTimeConverter);
}
}
主键long异常
现在能支持控制台打印执行的sql和参数吗!方便排查问题。
mod分表时自动生成表
可以结合Colder.Admin.AntdVue
在用户表里关联Base_DbLink
这样不同用户登录,实现连接不同的数据库
这样可以实现多租户功能
AllEntityTypes的方法是去找主目录下所有dll,那我实体所在的dll是通过插件形式放在某个目录下如plugins加载进来的话就没法进行查询了
需求:
一个基础库里存放有租户和对应的数据库名字,
添加租户时会自动创建一个新的业务数据库,结构一样
API怎么能根据不同的租户去找到对应的数据库名字,然后连接不同业务数据库,
因为我看现在的分库方案好像是必须已知数据库名称.
谢谢!
使用特性支持实体的复合主键和索引
分页出错,不支持SQLSERVER 2008
报 : OFFSET' 附近有语法错误。\r\n在 FETCH 语句中选项 NEXT 的用法无效。
大佬您好,最近在学习你的框架的时候,发现批量导入数据时,bool值导入到数据库后都是0了
先根据条件找分表,再通过分表查数据,尽量避免全表扫描
多主键支持
报异常
Microsoft.EntityFrameworkCore.DbUpdateException : An error occurred while updating the entries. See the inner exception for details.
---- System.InvalidOperationException : Operation is not valid due to the current state of the object.
堆栈跟踪:
ShardingRepository.PackAccessData(Func1 access) 行 74 ShardingRepository.WriteTable[T](List
1 entities, Func3 accessData) 行 119 ShardingRepository.Insert[T](List
1 entities) 行 179
ShardingRepository.Insert[T](T entity) 行 171
JsonbTest.Test() 行 72
----- Inner Stack Trace -----
JsonElement.WriteTo(Utf8JsonWriter writer)
JsonConverterJsonElement.Write(Utf8JsonWriter writer, JsonElement value, JsonSerializerOptions options)
JsonPropertyInfoNotNullable`4.OnWrite(WriteStackFrame& current, Utf8JsonWriter writer)
JsonPropertyInfo.Write(WriteStack& state, Utf8JsonWriter writer)
JsonSerializer.Write(Utf8JsonWriter writer, Int32 originalWriterDepth, Int32 flushThreshold, JsonSerializerOptions options, WriteStack& state)
JsonSerializer.WriteCore(Utf8JsonWriter writer, Object value, Type type, JsonSerializerOptions options)
JsonSerializer.WriteCore(PooledByteBufferWriter output, Object value, Type type, JsonSerializerOptions options)
JsonSerializer.WriteCoreString(Object value, Type type, JsonSerializerOptions options)
JsonSerializer.Serialize[TValue](TValue value, JsonSerializerOptions options)
JsonHandler.ValidateAndGetLength[TAny](TAny value, NpgsqlLengthCache& lengthCache, NpgsqlParameter parameter)
JsonHandler.ValidateObjectAndGetLength(Object value, NpgsqlLengthCache& lengthCache, NpgsqlParameter parameter)
NpgsqlParameter.ValidateAndGetLength()
NpgsqlCommand.ValidateParameters(ConnectorTypeMapper typeMapper)
NpgsqlCommand.ExecuteReaderAsync(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
NpgsqlCommand.ExecuteReader(CommandBehavior behavior)
NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
DbCommand.ExecuteReader()
RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
ReaderModificationCommandBatch.Execute(IRelationalConnection connection)
模型定义:
public class JsonbModel
{
/// <summary>
///
/// </summary>
[Key]
[Column("id")]
public Guid Id { get; set; } = SequentialGuid.SequentialGuidGenerator.Instance.NewGuid();// = Guid.NewGuid();
/// <summary>
///
/// </summary>
[Column("content", TypeName = "jsonb")]
public JsonElement Content { get; set; }
/// <summary>
/// 创建时间。
/// </summary>
[Column("created_on")]
public DateTime CreatedOn { get; set; } = DateTime.Now;
}
测试代码:
public void Test()
{
DateTime startTime = DateTime.Now.AddMinutes(-5);
DateTime endTime = DateTime.MaxValue;
//配置初始化
ShardingConfig.Init(config =>
{
config.AddAbsDb(DatabaseType.PostgreSql)//添加抽象数据库
.AddPhysicDbGroup()//添加物理数据库组
.AddPhysicDb(ReadWriteType.Read | ReadWriteType.Write, conn)//添加物理数据库1
.SetShardingRule(new JsonbShardingRule())//设置分表规则
.AutoExpandByDate<JsonbModel>(//设置为按时间自动分表
ExpandByDateMode.PerMinute,
(startTime, endTime, ShardingConfig.DefaultDbGourpName)
);
});
var db = DbFactory.GetShardingRepository();
for (var i= 0;i < 10; i++)
{
var content = JsonDocument.Parse("{\"id\": \"test\"}").RootElement;
db.Insert(new JsonbModel
{
Content = content
});
var count = db.GetIShardingQueryable<JsonbModel>().Count();
Console.WriteLine($"当前数据量:{count}");
Thread.Sleep(50);
}
}
删除时,报 该实体没有主键标识!请使用[Key]标识主键 错误。
请问是哪里有更新吗,还是新bug
上一版本有以下方法:
var db = DbFactory.GetRepository(_conString, _databaseType)
最新版本,DbFactory由public成了internal,请问可存在替换方法获取db
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.