关于自定义枚举数据库保存为字符串实体映射以及过滤器配置问题 返回
SqlSugar
沟通中
2
584
悬赏:0 飞吻
//实体信息
public class ShowCommodityMain
{
/// <summary>
/// 主键Id
/// </summary>
[SugarColumn(IsPrimaryKey = true, ColumnName = "ShowCommodityMain_Id")]
public override long Id { get; set; }
/// <summary>
/// 分类显示名称,不可为空
/// </summary>
public string ShowTitle { get; set; }
/// <summary>
/// 排序值,默认0,数值越大越排前
/// </summary>
public int SortOrderBy { get; set; }
/// <summary>
/// 是否显示出来:0=显示 1=不显示,默认0
/// </summary>
public VisibleStatus IsShow { get; set; }
/// <summary>
/// 删除状态
/// </summary>
[SugarColumn(ColumnDataType = "char(1)", SqlParameterDbType = typeof(EnumToStringConvert))]
public DeleteStatus? IsDel { get; set; } = DeleteStatus.N;
}//枚举信息
public enum DeleteStatus
{
/// <summary>
/// 否
/// </summary>
N,
/// <summary>
/// 是
/// </summary>
Y
}第一个问题,如果将枚举存到数据库为字符串,只有将实体的属性类型必须设置为可为空(DeleteStatus?),不然映射的时候会报错

第二个问题,如果使用全局过滤,查询条件默认使用的数值,而不是字符串
例如:db.QueryFilter.AddTableFilter<IDeleteMark>(x => x.IsDel == DeleteStatus.N);
生成的Sql语句为Select * from ShowCommodityMain where x.IsDel ==0导致报错,因为数据库存储的是字符串"N"
热忱回答(2)
-
✎..゛念舊 VIP0
2025/12/24我现在全局过滤的解决方案是以下方法
db.QueryFilter.AddTableFilter<IDeleteMark>(x => SqlFunc.Equals(x.IsDel, "N"));
0 回复 -
fate sta VIP0
2025/12/25接口也加上这个特性试一下。
0 回复