今天写项目的时候发现了一个问题找了很久。先说环境,我的数据库是pgsql,程序ORM框架是SqlSugarCore v5.1
需要进行分表操作,我的代码大概是这样的:
/// <summary>
/// 通道数据存储
/// </summary>
[SugarTable("Student")]
[SplitTable(SplitType._Custom01)]
public class StudentModel
{
/// <summary>
/// 主键雪花ID
/// </summary>
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; }
/// <summary>
/// 分表标识(编号)
/// </summary>
[SplitField]
public string? Code { get; set; }
/// <summary>
/// 名称
/// </summary>
[SugarColumn(IsNullable = true, Length = 255)]
public string? Name { get; set; }
/// <summary>
/// 值
/// </summary>
public double Value { get; set; }
}
这个是Model,看上去没什么问题对吧?(也确实没问题)
重写ISplitTableService 这个官网上很全面,我就不放上来了。
接下来划重点!!!
我的插入方法是这样的
/// <summary>
/// 批量插入数据
/// </summary>
/// <param name="models"></param>
public void InsertModelAsync(List<StudentModel> models)
{
_dbClient.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService = new CodeSplitService();
_dbClient.Insertable(models).SplitTable().ExecuteReturnSnowflakeIdList();
}
它可以正常工作,但是我的查询方法是这样的:
/// <summary>
/// 查询所有数据
/// </summary>
public List<StudentModel> QueryData(string tableName)
{
return _dbClient.Queryable<StudentModel>(tableName).SplitTable(s => s.ContainsTableNames(tableName))
.ToList();
}
运行查询方法的时候,程序出现异常,异常提示为:“中文提示 : 分表表名需要占位符 {year}”
查了很多地方,最后发现是因为没有指定分表后ISplitTableService服务的指向,后来在查询方法前加上了
_dbClient.CurrentConnectionConfig.ConfigureExternalServices.SplitTableService = new CodeSplitService();
这句话就可以了。
最开始我将这句代码放在构造函数中,以为只在这个Service服务中声明一次就可以了,但是自定义分表好像不能这样干。需要在查询方法之前再次声明。
以上,感谢各位看官老爷。