2010-09-10 73 views
1

我有一個TrackLog包含的GPS點的集合作爲TrackPoint對象:如何在Fluent NHibernate中自動映射組件集合?

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

如何映射元素的集合?

回答

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到使用它們是因爲我在另一個程序集中使用FNH。

0

非常第一個需要改變的是將List類型更改爲IList。需求的原因是因爲NHibernate需要注入自己的類型集合,而不是C#自己的List

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

這是否幫助?

+0

感謝您的IList'提示! – 2010-09-10 20:32:16

相關問題