2009-04-01 10 views
1

にこのコードを入力しNHibernateの基準が不一致

ICriteria crit = service.Session.CreateCriteria(typeof (DatabaseVersion)); 
crit.Add(Restrictions.Eq("Id.Minor", 4)); 
IList<DatabaseVersion> list = crit.List<DatabaseVersion>(); 

は、次のエラーが発生します。NHibernate.QueryException:NHibernate.Criterion.SimpleExpressionで型の不一致:Id.Minor期待タイプのSystem.Int16、実際の型を可能System.Int32

このエラーを修正するにはどうすればよいですか?私は運のないマッピングファイルに型を設定しました。私はコードに型キャストする必要はありません。

要求通りにマッピングファイルを追加しました。

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Core.NUnit.Domain.DatabaseVersion,Core.NUnit" table="`DatabaseVersion`" lazy="true" > 
    <composite-id name="Id" class="Core.NUnit.Domain.DatabaseVersionId,Core.NUnit"> 
     <key-property name="Major" column="`Major`" /> 
     <key-property name="Minor" column="`Minor`" type="Int16"/> 
     <key-property name="Build" column="`Build`" /> 
     <key-property name="Revision" column="`Revision`" /> 
    </composite-id> 
    <property name="Description" column="`Description`"/> 
    <property name="DateApplied" column="`DateApplied`"/> 
    </class> 
</hibernate-mapping> 
+0

マッピングはどのように見えますか? –

答えて

1

私は、C#が暗黙的にintをshortにキャストできないことが問題だと思います。あなたのマッピングがこのフィールドをInt16(short)にマップするようです。渡している "4"はデフォルトでintとして割り当てられます。 (私はなぜintを短いものと比較するのが難しいのかわかりません...)

私は短い略字の接尾辞があるとは思わない。これを行うことができます:

crit.Add(Restrictions.Eq("Id.Minor", (short)4));