Свойства перечисления с возможностью обнуления не поддерживаются в ORMLite для ServiceStack 3?

#c# #servicestack #ormlite-servicestack #servicestack-bsd

#c# #servicestack #ormlite-servicestack #servicestack-bsd

Вопрос:

Я использую ServiceStack 3 и ORMLite. Один из моих классов данных имеет свойство перечисления с возможностью обнуления, подобное этому:

 [Alias("CALL_SESSION")]
public class CallSession
{
    ...
    [Alias("RESULT")]
    public CallSessionResultEnum? Result { get; set; }
    ...
} 
  

В моей базе данных Oracle поле RESULT равно a NULLABLE NUMBER .

Когда я пытаюсь получить CallSession подобное:

 cn.Where<CallSession>(x => ....)
  

Я получаю исключение specified cast is not valid .
Все работает нормально, если я переключу тип поля в своем классе на простой int? . Правильно ли я понимаю, что ORMLite не поддерживает перечисления с нулевым значением?

Ответ №1:

У вас неверное переопределение метода ConvertDbValue в вашем OracleOrmLiteDialectProvider:

     public override object ConvertDbValue(object value, Type type)
    {
        if (type.IsEnum)
        {
            var val = Convert.ToInt32(value);
            if (!Enum.IsDefined(type, val))
                throw ExHelper.Argument(Errors.Common_EnumValueNotFound, val, type.FullName);

            return val;
        }
    }
  

Решение:

     public override object ConvertDbValue(object value, Type type)
    {
        if (type.IsEnum)
        {
            var val = Convert.ToInt32(value);
            if (!Enum.IsDefined(type, val))
                throw ExHelper.Argument(Errors.Common_EnumValueNotFound, val, type.FullName);

            return base.ConvertDbValue(value, type);
        }
    }