2009-08-25 29 views
2

これは他の3つのテーブルにマップされているコンポジットキーを持つレガシーテーブルを持っています。このテーブルは単純なマッピングテーブルではないので、このテーブルには他の属性があります。これをマッピングするための多対多の解決策です。nHibernateコンポジットキークラスタイプ不一致

次は私がやっていることです:

<class name="classA" table="A"> 
<composite-id name="ID" class="AKey"> 
    <key-many-to-one name="Id_one" class="One" column="Id_one" /> 
    <key-many-to-one name="Id_two" class="Two" column="Id_two" /> 
    <key-many-to-one name="Id_three" class="Three" column="Id_three" /> 
</composite-id> 

A-キーは、単に3つのIDを保持している構造体である、とId_one、Id_two、およびId_threeはすべて、それぞれのクラスでintとして定義されています。

public struct Akey { 
    public int Id_one { get; set; } 
    public int Id_two { get; set; } 
    public int Id_three { get; set; } 
} 

これは罰金コンパイルが、私はそれを実行しようとすると、それは私にエラーメッセージが表示できます:

NHibernate.QueryException:NHibernate.Criterion.SimpleExpressionで型の不一致:ID期待タイプA-キー、実際の型をSystem.Int32

私が間違っているか迷っているかについて助言してください。

ありがとうございました!

答えて

5

あなたは、キー・多対1を使用しようとしている場合は、クラス入れてしまうでしょう。そうでなければ

public class Akey { 
    public virtual One One {get; set;} 
    public virtual Two Two {get; set;} 
    public virtual Three Three {get; set;} 
} 

をあなたにIDをしたい場合は、あなただけのクラスAのプロパティとしてそれらをマップ:

<composite-id> 
    <key-property name="Id_one" column="Id_one" /> 
    <key-property name="Id_two" column="Id_two" /> 
    <key-property name="Id_three" column="Id_three" /> 
</composite-id> 

public class classA { 
    public virtual int Id_one {get; set;} 
    public virtual int Id_two {get; set;} 
    public virtual int Id_three {get; set;} 

    // ... rest of props ... 
} 

それともなどの複合材料などがあります。

<composite-id name="ID" class="AKey"> 
    <key-property name="Id_one" column="Id_one" /> 
    <key-property name="Id_two" column="Id_two" /> 
    <key-property name="Id_three" column="Id_three" /> 
</composite-id> 

public class AKey { 
    public virtual int Id_one {get; set;} 
    public virtual int Id_two {get; set;} 
    public virtual int Id_three {get; set;} 
} 

public class classA { 
    public virtual AKey ID {get; set;} 

    // ... rest of props ... 
} 

最後に...

<composite-id> 
    <key-many-to-one name="Id_one" class="One" column="Id_one" /> 
    <key-many-to-one name="Id_two" class="Two" column="Id_two" /> 
    <key-many-to-one name="Id_three" class="Three" column="Id_three" /> 
</composite-id> 

public class classA { 
    public virtual One One {get; set;} 
    public virtual Two Two {get; set;} 
    public virtual Three Three {get; set;} 

    // ... rest of props ... 
} 

私はC#でそれらに力を入れていないので、構造体を使用できるかどうかを調べることにします。

+0

返信いただきありがとうございます。最後の部分が私の問題を解決するのに役立ちました。 = P – Akey

+0

ええと...私はそれを書いた後、最後のものが最初のものだったはずです! – anonymous