2010-12-01 8 views
2

データベースに格納して文字列として取得する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のに組み込まれているものがあるうまくいきますか?

答えて

1

「ActionStatusEnumString」タイプが必要な理由を私に説明できますか? 列挙型はそうあなたが必要とするすべてがある、とにかく、デフォルトでは文字列としてマップする必要があります。

<property name="Status" /> 

私はこれらのクエリの並べ替えのすべての時間を、いずれかの文字列またはint型などのマッピング列挙型。

+0

私が受け取ったエラーとこのブログ記事の説明のために、 'ActionStatusEnumString'タイプを追加しました:http://codebetter.com/blogs/jeremy.miller/archive/2006/02/20/138732.aspx 。私はおそらく戻って、それを引き出し、単に.SetParameter( "status"、Enum.GetName(typeof(ActionStatus)、ActionStatus.Pending)) ')が' '私の問題を解決するかどうかを確認してください。マッピングを考えると、私はあなたが流暢に使っていないと推測していますよね? – ahsteele

+1

実際にはFluent NHibernateを使用しています。文字列の代わりに整数が必要な場合は、Map(x => x.Status).CustomType ();を使用します。 – cbp

+0

BTW。あなたがリンクしている記事は2006年のものです - それ以来多くのことが変わってきました! – cbp