2

次のクラス定義があるとします。

public class SomeEntity
{
    public class Key
    {
        public virtual OtherEntity Other { get; set; }
        public virtual int Index { get; set; }

        public override bool Equals(object other)
        {
            // something here...
        }

        public override int GetHashCode()
        {
            // something here...
        }
    }

    public virtual Key Id { get; set; }
}

public class OtherEntity
{
    public virtual int Id { get; set; }
}

次に、以下のようなマッピング ファイルが必要です。

<class name="SomeEntity" table="SOME">

  <composite-id name="Id" class="SomeEntity.Key">
    <key-many-to-one name="Other" column="OTHER_ID" class="OtherEntity" />
    <key-property name="Index" column="INDEX" type="int" />
  </composite-id>

</class>

<class name="OtherEntity" table="OTHER">

  <id name="Id" column="ID" type="int">
    <generator class="identity" />
  </id>

</class>

NHibernate を初期化しようとすると、 「could not find class: SomeEntity.Key」NHibernate.MappingExceptionというメッセージがスローされます。ほとんどの場合、問題は属性にあります。ネストされたクラスを参照するための適切な構文を見つけることができませんでした。class="SomeEntity.Key"

また、他にどこで答えを探すべきだったのかヒントを得たいと思います (たとえば、「NHibernate in Action」の本で答えを見つけることができませんでした)。NHibernate に関するそのような質問に対して優先するリソースは何ですか?

4

2 に答える 2

5

内部クラスには CLR 構文を使用する必要があります。

<composite-id name="Id" class="SomeEntity+Key">
...
于 2010-12-06T18:52:15.670 に答える
3
public class MainClass
{
  public virtual long MainKey {get; set;}
  public virtual SubClass SubInstance {get; set;}

  public class SubClass
  {
    public virtual long SubKey {get;set;}
  }
}

次のようにマッピングできます。

<class name="MainClass" table="Main">
  <id name="MainKey" column="MainId" type="Int64">
    <generator class="identity" />
  </id>
  <many-to-one name="SubInstance" class="MainClass+SubClass" Column="SubId"/> 
</class>

<class name="MainClass+SubClass" table="Sub">
  <id name="SubKey" column="SubId" type="Int64">
    <generator class="identity" />
  </id>
</class>
于 2012-09-10T14:34:50.023 に答える