Каков синтаксис XML для отображения вложенного класса в NHibernate? - PullRequest
2 голосов
/ 06 декабря 2010

Предположим, у вас есть следующие определения классов:

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 приводит к выдаче NHibernate.MappingException, при этом сообщение "не удалось найти класс: SomeEntity.Key" . Скорее всего, проблема в атрибуте class="SomeEntity.Key". Мне не удалось найти правильный синтаксис для ссылки на вложенный класс.

Также я хотел бы получить подсказку, где еще я должен был искать ответ (например, я не смог найти ответ в книге «NHibernate в действии»). Какой ресурс для таких вопросов вы предпочитаете в NHibernate?

Ответы [ 2 ]

5 голосов
/ 06 декабря 2010

Вы должны использовать синтаксис CLR для внутренних классов:

<composite-id name="Id" class="SomeEntity+Key">
...
2 голосов
/ 10 сентября 2012
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>
...