Отображение «один ко многим» NHibernate не заполняет пакет - PullRequest
2 голосов
/ 16 июля 2010

У меня есть простая объектная модель заголовка с несколькими подробными строками.Я сопоставил свойство bag объекта header с классом line, а также поместил свойство header в класс line, чтобы установить двусторонние отношения.

Когда я запускаю свои тесты, используя NHibernate Profiler, я вижу, чтозапрос выполняется, а заголовок и строки выбираются из базы данных, но коллекция всегда пуста.

Когда я запрашиваю коллекцию объектов строк напрямую, я могу получить их и увидеть, что объект заголовкаправильно заполнено, поэтому я знаю, что сопоставление, вероятно, в порядке.

Немного нестандартный аспект этого заключается в том, что у линейного объекта есть составной ключ.(Это устаревшая БД, и я не могу ее изменить), поэтому мне интересно, в этом ли проблема.

Вот мои классы и сопоставления (упрощенно)

  <class name="Header" table="HEADER">
    <id name="ID" column="HEAD_ID">
      <generator class="assigned" />
    </id>

    <bag name="Lines" table="BODY" order-by="BODY_LINE">
      <key column="BODY_HEADER_ID"/>
      <one-to-many class="Line"/>
    </bag>
  </class>

  <class name="Line" table="BODY">
    <composite-id>
      <key-property name="ID" column="BODY_HEADER_ID"/>
      <key-property name="Line" column="SBODY_LINE"/>
    </composite-id>
    <many-to-one class="Header" name="Head" column="BODY_HEADER_ID" />
  </class>

  public class Header {
        public virtual string ID { get; set; }
        public virtual IList<Line> Lines { get; set; }
  }

  public class Line {
        public virtual string ID { get; set; }
        public virtual int Line { get; set; }
        public virtual Header Head { get; set; }

        public override bool Equals(object obj) {
            var other = obj as Line;

            return ID == other.ID && Line == other.Line;
        }

        public override int GetHashCode() {
            return (ID + "|" + Line.ToString()).GetHashCode();
        }
    }

Я могуобойти это, запрашивая объекты Line отдельно, но я хотел бы знать, что я делаю неправильно.

EDIT : Хорошо, когда я упростил вещи, я не сделалделайте это очень последовательно.Извините за путаницу.Я изменил отображения и определения классов, чтобы точнее отражать их.

1 Ответ

3 голосов
/ 16 июля 2010

Вы отображаете один и тот же столбец дважды (BODY_HEADER_ID) и используете три разных имени класса для таблицы HEADER.

Это правильное отображение линии:

<class name="Line" table="BODY">
  <composite-id>
    <key-many-to-one class="Header" name="Header" column="BODY_HEADER_ID"/>
    <key-property name="Line" column="SBODY_LINE"/>
  </composite-id>
</class>

И, конечно, строка должна иметь только одну ссылку на заголовок.

...