如何在Fluent NHibernate中自动化组件集合?

时间:2010-09-10 02:12:23

标签: nhibernate fluent-nhibernate components automapping

我有一个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

如何映射组件集合?

2 个答案:

答案 0 :(得分:1)

我发现了我的问题。拉斐尔在回答您的问题时,TrackLog收藏了TrackPoints。通常在这种情况下,TrackPoint将是一个实体,但因为如果TrackPoint不属于TrackLogTrackLog不应该存在,我决定将其作为一个组件,它的生命周期为其父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设置覆盖类{{1}}才能使用它们,因为我在另一个程序集中使用了FNH。

答案 1 :(得分:0)

需要更改的第一个事情是将List类型更改为IList。需要的原因是因为NHibernate需要注入自己的集合类型,而不是C#自己的List

我不明白的是TrackPoint本身。你说它是一个消耗自己的组件?你能给我们更多的见解吗?我很困惑。

假设我有一个使用TrackPoint作为组件的类Track:

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);
 } 
}

这有帮助吗?