データベースに格納して文字列として取得するenumプロパティがあります。 NHibernateの文字列として列挙を格納することが可能であるが、検索時に次の変換例外をスロー:NHibernateで列挙型を使用してvarchar値xxxxをintに変換するときに変換に失敗しました
NHibernate.ADOException:実行できませんでしたクエリ - > System.Data.SqlClient.SqlException:変換するとき 変換が失敗しましたvarchar値 'Pending'をデータ型intに変換します。
public class WorkflowAction { public virtual ActionStatus Status { get; set; } }
この列挙を使用しています:
文字列 に変換するために、このクラスを使用していますpublic enum RequestState { Pending, Approved, Rejected }
私は次のクラスを作成したジェレミー・ミラーポストMapping Enumerations with NHibernateに基づいて
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'タイプを追加しました:http://codebetter.com/blogs/jeremy.miller/archive/2006/02/20/138732.aspx 。私はおそらく戻って、それを引き出し、単に.SetParameter( "status"、Enum.GetName(typeof(ActionStatus)、ActionStatus.Pending)) ')が' '私の問題を解決するかどうかを確認してください。マッピングを考えると、私はあなたが流暢に使っていないと推測していますよね? – ahsteele
実際にはFluent NHibernateを使用しています。文字列の代わりに整数が必要な場合は、Map(x => x.Status).CustomType();を使用します。 –
cbp
BTW。あなたがリンクしている記事は2006年のものです - それ以来多くのことが変わってきました! – cbp