使用Dapper填充枚举属性

31

在使用 Dapper 的 Query() 函数时,我试图填充一个具有枚举值属性的类。在我的数据库中,该列存储为字节。但是在类中,它们是枚举类型。在旧的 ADO.NET 方法中,我会在读取循环中进行转换:

myClass.myEnum = (MyEnumType) reader.GetByte(2);

在使用 Dapper 时,我无法弄清如何进行此转换。例如,当我执行以下操作时:

myClass = conn.Query<MyClassType>("SELECT ... ")

我遇到了一种类型的错误

Error parsing column 2 (myEnum=1 - Byte)
有没有办法使用Dapper的Query()方法来填充一个包含枚举类型属性的类?

请注意,如果在SQLITE中的数据类型为“INT”,则使用Dapper从Sqlite持久化和检索.NET枚举不需要特殊代码。 - BrokeMyLegBiking
1个回答

44
当然可以 - 只要您的枚举同意,即:
enum MyEnumType : byte {
    Foo, Bar, Blip, ...
}

然后它将会自动运行(这个限制是有意设计的,跟LINQ-to-SQL一样)。

或者,如果枚举类型是 : int 并且不能更改,则在 SQL 中进行强制转换:

SELECT ..., CAST(x.myEnum as int) as myEnum, ...

最后,您可以使用 dynamic API:

foreach(var row in conn.Query(...)) { // note no <T>
    T obj = new Item { /* copy from row */ };
    ...
}

首选对象是我的首选,因为它可以在整个代码中强制实施 byte 数据类型的限制,这在我看来是一件好事。


1
成功了!我不知道内存存储类型会有这么大的影响。谢谢你! - Slaggg
31
注意,如果您没有明确设置枚举值,这可能会很危险。您需要使用以下代码:enum MyEnumType : byte { Foo = 1, Bar = 2, Blip = 3, ... }。否则,某些初级开发人员可能会在Foo和Bar之间插入Biz,并重新定义Biz之后的任何值。这些数据库值现在就变成了错误的值。 - xanadont
1
这是非常合理的,但对于SQLite来说有点不幸,因为它将所有整数报告为64位数字(这意味着即使只有少量值,所有枚举也必须继承long)。我想这更多是SQLite的限制,而不是Dapper的限制 :-) - Cameron
3
@Cameron 在 GitHub 上提交了一个名为 dapper-dot-net 的项目的更新,该更新的提交 ID 是 9b0808d441d535fe6395c9241f3d82deb0ee8698。 - Marc Gravell
据我所见,现在几乎所有的东西都可以很清晰地映射到其他任何东西。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接