Coldairarrow / EFCore.Sharding

Database Sharding For EFCore
Apache License 2.0
693 stars 143 forks source link

.net5.0 mysql 按时间分表,插入数据时报错 #115

Closed rojiny closed 2 years ago

rojiny commented 2 years ago

平台版本:5.0.0 Efcore版本:5.0.9 Mysql库版本:Pomelo.EntityFrameworkCore.MySql 5.0.1 Efcore.sharding 版本:5.0.15

Start.cs 配置代码: ` bool enabledSharding = config.GetValue("Sharding:Eanbled", true); if (enabledSharding) { services.AddEFCoreSharding(config => { config.SetEntityAssemblies(Assembly.GetExecutingAssembly()); config.CreateShardingTableOnStarting(true);

                config.AddDataSource(connectionString, ReadWriteType.Read | ReadWriteType.Write, isMysql ? DatabaseType.MySql : DatabaseType.SqlServer);

                config.SetDateSharding<Attendance>(nameof(Attendance.WorkDate), ExpandByDateMode.PerMonth, new DateTime(2021, 4, 1));

                config.SetDateSharding<ShardingData>(nameof(ShardingData.Date), ExpandByDateMode.PerMonth, new DateTime(2021, 1, 1));
            });
        }`

数据库操作代码: var list = new List<ShardingData>(1000); var rdn = new Random(); for(var i = 0; i < 1000; i++) { var model = new ShardingData { Id = Yitter.IdGenerator.YitIdHelper.NextId(), Text = "" + "ABCDE"[rdn.Next(0, 4)], Value = rdn.Next(1000, 9999), Date = new DateTime(2021, rdn.Next(1, 12), rdn.Next(1, 28)) }; list.Add(model); } var count = await shardingDb.InsertAsync(list); var query = shardingDb.GetIShardingQueryable<ShardingData>(); var max = await query.MaxAsync(e => e.Value); var total = await query.Where(e => e.Date >= new DateTime(2021,4,1) && e.Date >= new DateTime(2021, 6, 30)).SumAsync(e => e.Value); var detail = await query.Where(e => e.Text == "A").OrderBy(e => e.Date).ToListAsync();

报错信息: System.InvalidOperationException: Sequence contains no elements at System.Linq.ThrowHelper.ThrowNoElementsException() at System.Linq.Enumerable.Single[TSource](IEnumerable1 source) at EFCore.Sharding.ShardingContainer.GetTheWriteTable[T](T obj) at EFCore.Sharding.ShardingDbAccessor.<>c__DisplayClass8_01.b__0(T x) at System.Linq.Enumerable.SelectListIterator2.ToList() at EFCore.Sharding.ShardingDbAccessor.WriteTableAsync[T](List1 entities, Func3 accessDataAsync) at EFCore.Sharding.ShardingDbAccessor.InsertAsync[T](List1 entities, Boolean tracking) at WebApi.Api.DingtalkController.ShardingTest() in C:\Workshop\DingSync\WebApi\Api\DingtalkController.cs:line 75

WangJunZzz commented 2 years ago

你好,这个问题怎么解决得?