关于自定义枚举数据库保存为字符串实体映射以及过滤器配置问题 返回

SqlSugar 沟通中
2 584
//实体信息
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
}
  1. 第一个问题,如果将枚举存到数据库为字符串,只有将实体的属性类型必须设置为可为空(DeleteStatus?),不然映射的时候会报错image.png

  2. 第二个问题,如果使用全局过滤,查询条件默认使用的数值,而不是字符串

    例如:db.QueryFilter.AddTableFilter<IDeleteMark>(x => x.IsDel == DeleteStatus.N);

    生成的Sql语句为Select * from ShowCommodityMain where x.IsDel ==0导致报错,因为数据库存储的是字符串"N"

热忱回答2

  • 我现在全局过滤的解决方案是以下方法

      db.QueryFilter.AddTableFilter<IDeleteMark>(x => SqlFunc.Equals(x.IsDel, "N"));

    0 回复
  • fate sta fate sta VIP0
    2025/12/25

    接口也加上这个特性试一下。

    0 回复