我有一个枚举属性,我想将其作为字符串从数据库中存储和检索。 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内置了一些我缺少的内容,使得这种转换更加自动化吗?
答案 0 :(得分:1)
你能解释一下为什么你需要'ActionStatusEnumString'类型吗? 无论如何,枚举应该默认映射为字符串,所以你只需要:
<property name="Status" />
我一直在进行这些查询,将枚举映射为字符串或整数。