我有一个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
如何映射组件集合?
答案 0 :(得分:1)
我发现了我的问题。拉斐尔在回答您的问题时,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设置覆盖类{{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);
}
}
这有帮助吗?