У меня есть TrackLog
, у которого есть коллекция TrackPoints
:
public class TrackLog
{
public string Name { get; set; }
public ISet<TrackPoint> TrackPoints { get; set; }
}
public class TrackPoint
{
public DateTime Timestamp { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
}
Я бы хотел отобразить точки треков как набор компонентов, так как это имеет смысл. Согласно книге NHibernate в действии , на стр. 187:
Коллекции компонентов отображаются аналогично другим коллекциям экземпляров типа значения. Единственное отличие заключается в использовании <composite-element>
вместо привычного тега <element>
.
Как бы я это сделал, используя атрибуты Castle ActiveRecord?
Решение:
Чтобы расширить ответ Маурисио, правильное отображение выглядит так:
[ActiveRecord]
public class TrackLog
{
[Property]
public string Name { get; set; }
[HasMany(DependentObjects = true,
MapType = typeof(TrackPoint),
Table = "TrackPoint",
ColumnKey = "TrackLog_Id"
)]
public ISet<TrackPoint> TrackPoints { get; set; }
}
В дополнение к DependentObjects
.
вы должны указать свойства
MapType
,
Table
и
ColumnKey
.
MapType
: тип класса, который вы хотите сопоставить с
Table
: имя таблицы в базе данных для списка компонентов
ColumnKey
: имя столбца внешнего ключа, используемого для связи дочернего элемента с родительским
Обновление:
Вы не можете использовать Set
в качестве RelationType
. Это заставит NHibernate проявить какое-то странное поведение, при котором он сохраняет сущности, удаляет их и повторно сохраняет две копии каждого элемента. В случае с моим TrackLog
он сохранил 25 TrackPoints
, удалил их, а затем снова сохранил 25 TrackPoints
два раза, всего 50. Затем, когда был удален SessionScope
, он сохранил еще 25, в общей сложности 75 TrackPoints
вместо ожидаемых 25. Я не мог выяснить источник этой проблемы, но исправление состоит в том, чтобы избегать использования Set
и использования Bag
(или что-то еще, я только проверял это вместо Bag
).