Closed wanghucheng66 closed 1 year ago
@wanghucheng66 看错误应该是Concurrent并发异常你是否有并发字段比如ConcurrentToken或者Version版本号字段
DbUpdateConcurrencyException: The database operation was expected to affect 1 row(s), but actually affected 0 row(s);
提示应该只有一条受影响但是现在是0条受些影响,是否有重写过SaveChange如果有那么请重新带入参bool的SaveChange而不是无参数的
感谢快速的回复!!! Sharding-core相关的配置项如下. CDMSContext中没有重载SaveChange. 刚才发现把.UseLazyLoadingProxies() 都去掉就可以正常更新了. 我这个懒加载配置是不是配置有问题?
`///
}).UseConfig((provider, op) =>
{
op.MaxQueryConnectionsLimit = Environment.ProcessorCount;
op.CacheModelLockConcurrencyLevel = 1024;
op.CacheEntrySize = 10;
op.CacheModelLockObjectSeconds = 30;
op.CheckShardingKeyValueGenerated = false;
//当无法获取路由时会返回默认值而不是报错
op.ThrowIfQueryRouteNotMatch = false;
op.UseShardingQuery((conStr, builder) =>
{
builder
.UseLazyLoadingProxies()
.UseSqlServer(conStr);
});
op.UseExecutorDbContextConfigure((builder) =>
{
builder
.UseLazyLoadingProxies()
.UseSqlServer(sqlServerBuilder)
.UseLoggerFactory(efLogger);
});
op.UseShardingTransaction((connection, builder) =>
{
builder
.UseLazyLoadingProxies()
.UseSqlServer(connection, sqlServerBuilder)
.UseLoggerFactory(efLogger);
});
op.AddDefaultDataSource(CDMSContext.DefaultDataSource, APISystemCommonConfig.DataBaseConnection);
var serviceProvider = builder.Services.BuildServiceProvider();
var eventLogger = serviceProvider.GetService<ILogger<CDMSContext>>();
}).AddShardingCore();`
应该是这个代理问题导致的
.UseConfig((sp, o) =>
{
//尝试添加一下这个试试,但是不一定可以,因为你主要还是并发字段的多次修改导致的应该是
o.UseEntityFrameworkCoreProxies = true;
o.UseShardingQuery((conStr, builder) =>
{
builder.UseMySql(conStr, new MySqlServerVersion(new Version()));
});
o.UseShardingTransaction((connection, builder) =>
{
builder
.UseMySql(connection, new MySqlServerVersion(new Version()));
});
})
非常感谢. 可以关掉这个issue了. 增加这一行配置之后就可以了. o.UseEntityFrameworkCoreProxies = true;
我的分片表使用了按年份分表 AbstractSimpleShardingYearKeyDateTimeVirtualTableRoute 没有进行分库, 只有一个数据库. Sharding-core版本 sharding-core-7.x.1.17 .NET版本 .Net6.0.23 EFCore版本: Microsoft.EntityFrameworkCore.7.0.13 数据库: MS SQL Server 2017
修改字段代码: 数据可以正常查询出来, 但是无论数据处于那个年份的分片表中, 保存更改的时候都会报错. 从日志看, 保存的时候输出的SQL更新语句都是 UPDATE [dbo].[DistributorInventoryDaily]. 没有更新到正确的表.
分表路由:
报错详细信息