Skip to content

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

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions