从Char映射到布尔值

本文关键字:布尔值 映射 Char | 更新日期: 2023-09-27 18:25:16

我们使用Dapper作为遗留Informix数据库的ORM,在该数据库中,布尔字段实际上存储为Char,"F"表示False,"T"表示True。

在我们的POCO中,我们希望公开一个布尔属性,并指示Dapper在读取和写入数据库时映射到相关的char值。

例如:

假设我们在一个名为"活动"的表中有一个字段。数据库中Active列的值为"T"或"F"

我们的POCO可能看起来像这样:

public class MyTable
{
    public bool Active { get; set; }
}

是否可以在Dapper中创建一个自定义映射,如果基础值为"T",则此列将POCO中的Active属性设置为true,如果为"F",则设置为false?

我知道我可以解决这个问题的一种方法是有两个属性,一个是Dapper可以直接映射到的字符串,另一个是POCO消费者使用的布尔值。即:

public class MyTable
{
    public string Active { get; set; }
    public bool MyActive 
    {
        get { return Active == "T"; }
        set { Active = (value == "T"); }
    }
}

这种方法的缺点是必须维护两个属性,所以如果有一种方法可以扩展dapper,让它为我做到这一点,那将是一件很棒的事情(尤其是在我们的数据库表中有很多这样的字段)。

我已经考虑过实现自定义类型映射,但尽管这适用于自定义复杂类型,但当我想从一个基本类型映射到另一个基本型时,我不确定它在这种情况下会如何工作。

从Char映射到布尔值

我怀疑dapper是否支持它,看看这个相关问题的答案。正如您所看到的,Active-属性甚至不必是公共的,将其设为private以避免混淆。但是,我会将您的bool属性命名为IsActive

public class MyTable
{
    private string Active { get; set; }
    public bool IsActive 
    {
        get { return Active == "T"; }
        set { Active = value ? "T" : "F"; }
    }
}