Сбой преобразования при преобразовании значения varchar xxxx в int с использованием enum с NHibernate - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть свойство 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, которое мне не хватает, что делает это преобразование более автоматическим?

1 Ответ

1 голос
/ 02 декабря 2010

Можете ли вы объяснить мне, почему вам нужен тип 'ActionStatusEnumString'?В любом случае перечисления должны отображаться как строки по умолчанию, поэтому все, что вам нужно:

<property name="Status" />

Я выполняю такие запросы постоянно, отображая перечисления как строки или целые числа.

...