使用Dapper填充Enum属性

Sla*_*ggg 30 c# enums dapper

在使用Dapper的Query()函数时,我试图填写一个具有枚举值属性的类.在我的数据库中,此列存储为一个字节.然而,在课堂上,它们是一个枚举.在旧的ADO.NET方法中,我将在阅读器循环期间进行转换:

myClass.myEnum = (MyEnumType) reader.GetByte(2);
Run Code Online (Sandbox Code Playgroud)

使用Dapper时,我无法弄清楚如何进行此转换.例如,当我做类似的事情

myClass = conn.Query<MyClassType>("SELECT ... ")
Run Code Online (Sandbox Code Playgroud)

我收到了类型的错误

Error parsing column 2 (myEnum=1 - Byte)
Run Code Online (Sandbox Code Playgroud)

有没有办法使用Dapper的Query()来填充包含枚举类型属性的类?

Mar*_*ell 42

当然 - 只要你的枚举同意,即

enum MyEnumType : byte {
    Foo, Bar, Blip, ...
}
Run Code Online (Sandbox Code Playgroud)

然后它将全部自动工作.

(此限制是设计使然,并在发生时与LINQ-to-SQL共享)

或者,如果枚举是: int且无法更改,则将其强制转换为SQL:

SELECT ..., CAST(x.myEnum as int) as myEnum, ...
Run Code Online (Sandbox Code Playgroud)

或者最后,使用dynamicAPI:

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

第一个是我的首选对象,因为它会byte在所有代码中强制执行数据类型限制,这对IMO来说是件好事.

  • 小心,如果您没有明确设置枚举值,这可能会很危险.你想做枚举MyEnumType:byte {Foo = 1,Bar = 2,Blip = 3,...}如果没有,一些初级开发人员会来到你身后并在Foo和Bar之间插入Biz并重新定义Biz之后的任何值.那些数据库值现在是错误的. (28认同)
  • @Cameron https://github.com/StackExchange/dapper-dot-net/commit/9b0808d441d535fe6395c9241f3d82deb0ee8698 (3认同)
  • @Cameron,下次我在该地区黑客攻击时,我会看到可以做什么 (2认同)