У меня есть простая объектная модель заголовка с несколькими подробными строками.Я сопоставил свойство 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 : Хорошо, когда я упростил вещи, я не сделалделайте это очень последовательно.Извините за путаницу.Я изменил отображения и определения классов, чтобы точнее отражать их.