Skip to content

自动分表功能未开启AutoSyncStructure时无法读取跨月数据的问题 #2243

@cctczyg

Description

@cctczyg

问题描述及重现代码:

系统按功能分了模块微服务,但是表都在同一个数据库,比如有三个表:设备表、设备状态表(自动跨月分表)、能耗表,一个设备微服务负责维护设备表和设备状态表,定时读取设备状态,并存入设备状态表;另一个能耗微服务负责维护设备能耗表,每天固定时间计算前一天的能耗,平时工作正常,但跨月时,却读不到设备状态表的数据,导致跨月1号的能耗为0

注意:两个微服务AutoSyncStructure都是false,平时有一个线程检测表的结构同步:
利用以下代码同步未分表的结构:
EntityHelper.FSql.CodeFirst.SyncStructure(typeof(DeviceInfo));
利用以下代码同步分表的结构:
var tabNameNext = EntityHelper.FSql.CodeFirst.GetTableByEntity(t)
.AsTableImpl.GetTableNameByColumnValue(monthNext, autoExpand: true);
EntityHelper.FSql.CodeFirst.SyncStructure(t, tabNameNext);

//设备表
public class DeviceInfo
{
    //xxx
}
//设备状态表
[Table(Name = "z_log_dev_{yyyy_MM}", AsTable = "Time=2026-02-01(1 month)")]
public class DeviceLog
{
    public DatetTime Time{get;set;}
    public fload Energy{get;set;}
    //xxx
}
//设备能耗表
public class DeviceEnergy
{
    public DateTime Day{get;set;}
    public float Energy{get;set;}
}

问题描述:
1、比如2026年5月两个微服务启动,程序运行正常,5月份的能耗计算都正常;
2、到2026年6月1号,表z_log_dev_2026_06已正常生成,且有数据,但6月1号的能耗计算逻辑里,查不到表z_log_dev_2026_06里的状态记录,导致能耗无法计算。
3、6月2号下午重启能耗计算微服务后,表z_log_dev_2026_06的数据可以正常读取,可以在6月3号正常计算6月2号的能耗。

数据库版本

mysql 5.6和sql server 2017都是这样的问题

安装的Nuget包

FreeSql.Provider.SqlServer 3.2.810
FreeSql.Provider.MySql 3.2.810

.net framework/. net core? 及具体版本

.net5

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions