Dapper枚举映射

时间:2016-04-25 12:13:32

标签: .net dapper

我需要有关使用Dapper和Oracle映射枚举的帮助。

我在Oracle类型NUMBER(1)中有一个字段,必须在我的实体中变成一个枚举。

public Status Status { get; set; }

状态是枚举:

public enum Status
{
    [Description("Inactive", "0")]
    Inactive = 0,

    [Description("Active", "1")]
    Active = 1,
 }

如何使用Dapper进行映射?

4 个答案:

答案 0 :(得分:6)

Enums应使用JustWork™进行整数或字符串表示。如果它不起作用,您必须更加具体地说明它正在抛出的任何异常。例如,大声思考和纯粹的猜测,但是:IIRC Oracle习惯于将大数字想象为64位,我想知道ebun映射代码是否处理所有类型的数字转换。如果它没有,那那就是一个错误。

所以:它有用吗?

答案 1 :(得分:0)

在其他答案中仅凭声音建议明确即可。您的数据库可能将数据存储在名为StatusId的列中,而对象的属性可能只是Status

我通常通过在SQL查询中使用别名来解决此问题:

SELECT StatusId AS Status FROM Table

Dapper暗中了解如何将int数据库字段映射到C#枚举。我通常会给枚举明确的值,以使事情尽可能清晰,例如

public enum Status
{
   Active = 1,
   Inactive = 2
}

答案 2 :(得分:0)

在使用 dapper 时,我无法让可为空的枚举工作。

为了解决这个问题,我创建了两个类:对象模型和 SQL 模型。

SQL 模型是对象模型的简单版本,将枚举作为字符串保存在数据库中。对象模型有一个构造函数,以 SQL 模型作为输入。

class ThingSQLModel
{
    public int? Id;

    public String? ThingType;

 ....


}

class Thing
{
    public int? Id;

    public EnumThingType? ThingType{ get; set; }

 ....

    public Thing(ThingSQLModel)
    {
        Id = output.Id;

        ThingType= EnumHelper.TryParseNullable<EnumThingType>(output.ThingType);
    }
}

对于 TryParseNullable<EnumThingType> 见: Parsing value into nullable enumeration

通过显式覆盖此类型的默认解析,也许有更好的方法?唔。我会尝试并给出答案。

答案 3 :(得分:-1)

 public enum MyEnum
 {
     None,
     Success,
     Failure
 }

var enums = connection.Query<string>("select 'None' union select 'Success' union select 'Failure'")
        .Select(x => Enum.Parse(typeof (MyEnum), x)) //use your own method to parse enum from string
        .ToList();