У меня есть свойство enum, которое я хочу сохранить и извлечь из базы данных в виде строки. NHibernate может хранить перечисление в виде строки, но выдает следующее исключение преобразования при извлечении:
NHibernate.ADOException: не удалось выполнить запрос -> System.Data.SqlClient.SqlException:
Ошибка преобразования при преобразовании значения varchar 'Pending' в тип данных int.
Основано на публикации Отображение перечислений с помощью NHibernate Джереми Миллером. Я создал следующий класс:
public class WorkflowAction
{
public virtual ActionStatus Status { get; set; }
}
который использует это перечисление:
public enum RequestState
{
Pending,
Approved,
Rejected
}
который использует этот класс для преобразования в строку
public class ActionStatusEnumString : NHibernate.Type.EnumStringType
{
public ActionStatusEnumString()
: base(typeof(ActionStatus), 50) { }
}
и настройте свойство в моем файле отображения следующим образом:
<property type="Infrastructure.Enum.ActionStatusEnumString, Infrastructure"
name="Status" column ="status" />
Как я уже сказал, это прекрасно работает для сохранения данных. Однако, когда я хочу получить с помощью этого параметра, я получаю исключение преобразования.
return GetSession().CreateQuery(
@"select distinct requests from WorkflowRequestInformation as requests
join requests.WorkflowRequestInformationActionList as actions
where actions.Status = :status
.SetParameter("status", ActionStatus.Pending)
.List<WorkflowRequestInformation>();
NHibernate отправляет ActionStatus.Pending
в базу данных как целое число. Я предполагаю, что это потому, что NHibernate просто работает ActionStatus.Pending.ToString()
.
Я могу изменить свой код на любой из следующих, и он будет работать
// defeats the purpose of the enum
.SetParameter("status", "Pending")
// while this feels heavy handed
.SetParameter("status", Enum.GetName(typeof(ActionStatus), ActionStatus.Pending))
Есть ли что-то встроенное в NHibernate, которое мне не хватает, что делает это преобразование более автоматическим?