Использование Dapper для заполнения свойств перечисления

#c# #enums #dapper

#c# #перечисления #dapper

Вопрос:

При использовании функции Dapper Query() я пытаюсь заполнить класс, у которого есть свойство, представляющее собой перечисляемое значение. В моей базе данных этот столбец хранится в виде байта. Однако в классе они являются перечислением. В старом ADO.NET подход, я бы преобразовал во время цикла чтения:

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

При использовании Dapper я не могу понять, как выполнить это преобразование. Например, когда я делаю что-то вроде

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

Я получаю ошибку типа

 Error parsing column 2 (myEnum=1 - Byte)
  

Есть ли способ использовать запрос Dapper () для заполнения класса, который содержит свойства, являющиеся перечисляемыми типами?

Комментарии:

1. Обратите внимание, что если тип данных в SQLITE равен «INT», то для сохранения и извлечения перечислений .NET из Sqlite с использованием Dapper не требуется специального кода.NET.

Ответ №1:

Конечно — до тех пор, пока ваше перечисление согласуется, т.Е.

 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. Это сработало! Я не знал, что тип хранилища в памяти имеет такое значение. Спасибо!

2. Осторожно, это может быть опасно, если вы явно не задаете значения для своих перечислений. Вы хотите выполнить перечисление MyEnumType : byte { Foo = 1, Bar = 2, Blip = 3, … } Если нет, какой-нибудь младший разработчик подойдет к вам сзади и вставит Biz между Foo amp; Bar и переопределит значения чего-либо после Biz. Эти значения базы данных теперь неверны.

3. Это имеет смысл, но немного неудачно в отношении SQLite, который сообщает все целые числа как 64-разрядные числа (что означает, что все enum s должны наследоваться long , даже если у них всего несколько значений). Я думаю, что это скорее ограничение SQLite, чем Dapper, хотя 🙂

4. @Cameron github.com/StackExchange/dapper-dot-net/commit /…

5. @Cameron насколько я могу судить, практически все теперь четко сопоставляется практически со всем