gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:25:01 38 4
gpt4 key购买 nike

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

NHibernate.ADOException: could not execute query --> System.Data.SqlClient.SqlException: Conversion failed when converting the varchar value 'Pending' to data type int.

基于帖子Mapping Enumerations with NHibernate杰里米·米勒 (Jeremy Miller) 我创建了以下类(class):

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 中是否有我遗漏的内置功能可以使这种转换更加自动化?

最佳答案

您能向我解释一下为什么需要“ActionStatusEnumString”类型吗?无论如何,枚举都应该默认映射为字符串,因此您只需要:

<property name="Status" />

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

关于c# - 使用带有 NHibernate 的枚举将 varchar 值 xxxx 转换为 int 时转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4328808/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com