Что эквивалентно <составной-элемент> в замке ActiveRecord? - PullRequest
0 голосов
/ 17 апреля 2010

У меня есть 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).

1 Ответ

0 голосов
/ 17 апреля 2010

Использование DependentObjects = true, например ::

public class TrackLog {
   [Property]
   public string Name { get; set; }

   [HasMany(DependentObjects = true)]
   public ISet<TrackPoint> TrackPoints { get; set; }
}
...