使用带有NHibernate的枚举将varchar值xxxx转换为int时转换失败

时间:2010-12-01 20:31:41

标签: c# nhibernate enums nhibernate-mapping

我有一个枚举属性,我想将其作为字符串从数据库中存储和检索。 NHibernate能够将枚举存储为字符串,但在检索时会抛出以下转换异常:

  

NHibernate.ADOException:无法执行查询 - > System.Data.SqlClient.SqlException:   将varchar值'Pending'转换为数据类型int时,转换失败。

基于Jeremy Miller的帖子Mapping Enumerations with 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 个答案:

答案 0 :(得分:1)

你能解释一下为什么你需要'ActionStatusEnumString'类型吗? 无论如何,枚举应该默认映射为字符串,所以你只需要:

<property name="Status" />

我一直在进行这些查询,将枚举映射为字符串或整数。