#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);
}
}