1

我有一个TrackLog包含作为TrackPoint对象的 GPS 点集合:

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

如何映射组件集合?

4

2 回答 2

1

我发现了我的问题。Rafael,在回答您的问题时,TrackLog收集了TrackPoints. 通常在这种情况下,TrackPoint它将是一个实体,但是因为TrackPoint如果 a 不属于 a 就不应该存在TrackLog,我决定将它作为一个组件,将它的生命周期与它的 parent 联系起来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。

于 2010-09-10T20:37:47.047 回答
0

需要更改的第一件事List是将类型更改为IList. 之所以需要,是因为 NHibernate 需要注入自己的集合类型,而不是 C# 自己的List.

我不明白的是 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);
 } 
}

这有帮助吗?

于 2010-09-10T12:24:31.270 回答