我需要有关使用Dapper和Oracle映射枚举的帮助。
我在Oracle类型NUMBER(1)中有一个字段,必须在我的实体中变成一个枚举。
public Status Status { get; set; }
状态是枚举:
public enum Status
{
[Description("Inactive", "0")]
Inactive = 0,
[Description("Active", "1")]
Active = 1,
}
如何使用Dapper进行映射?
答案 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();