Как автоматизировать набор компонентов в Fluent NHibernate?

У меня есть TrackLog, который содержит набор точек GPS в виде объекта TrackPoint:

public class TrackPoint
{
    public virtual int Id { get; set; }
    public virtual List<TrackPoint> TrackPoints { get;set; }
}

public class TrackLog
{
    public virtual double Latitude { get; set; }
    public virtual double Longitude { get; set; }
    public virtual DateTime Timestamp { get; set; }
}

TrackPoint — это компонент, и я создал IAutomappingConfiguration, который указывает FNH отображать его как таковой. Однако, когда я пытаюсь запустить свою программу, FNH выдает следующее исключение:

Ассоциация ссылается на несопоставленный класс: TestProject.Components.TrackPoint

Как сопоставить набор компонентов?


person Daniel T.    schedule 10.09.2010    source источник


Ответы (2)


Я понял свою проблему. Рафаэль, отвечая на твой вопрос, у TrackLog есть коллекция TrackPoints. Обычно в этом случае TrackPoint был бы сущностью, но поскольку TrackPoint не должен существовать, если он не принадлежит TrackLog, я решил сделать его компонентом, который связывает свое время жизни с его родителем TrackLog.

Оказывается, проблема заключалась в том, что, несмотря на то, что я создал переопределение автоматического сопоставления, оно не работало:

internal class TrackLogOverride : IAutoMappingOverride<TrackLog>
{
    public void Override(AutoMapping<TrackLog> mapping)
    {
        mapping.HasMany(x => x.TrackPoints).Component(x =>
            {
                x.Map(m => m.Latitude);
                x.Map(m => m.Longitude);
                x.Map(m => m.Timestamp);
            });
    }
}

Оказывается, мне нужно было сделать класс переопределения public для FNH, чтобы использовать их, потому что я использовал FNH в другой сборке.

person Daniel T.    schedule 10.09.2010

Самое первое, что необходимо изменить, — изменить тип List на IList. Причина потребности в том, что NHibernate нужно внедрить свой собственный тип коллекции, а не собственный List C#.

Чего я не понимаю, так это TrackPoint как такового. Вы говорите, что это компонент, потребляющий сам себя? Не могли бы вы дать нам больше информации? Я смущен.

Скажем, у меня есть класс Track, который использует TrackPoint как компонент:

public class TrackMap : ClassMap<TrackPoint>
{
 Id(x => x.Id);

 Component(x => x.TrackPoint, m =>
 {
      m.Map(x => x.Id);

         // Try one of the following (not sure):
         m.Map(x => x.TrackPoints);
         m.HasMany(x => x.TrackPoints);
 } 
}

Это помогает?

person rebelliard    schedule 10.09.2010