我有TrackLog
,其集合为TrackPoints
:
public class TrackLog
{
public string Name { get; set; }
public ISet<TrackPoint> TrackPoints { get; set; }
}
public class TrackPoint
{
public DateTime Timestamp { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
}
我想将轨迹点映射为组件的集合,因为这是最有意义的。根据 NHibernate in Action 一书,第187页:
组件集合类似地映射到其他值类型实例集合。唯一的区别是使用
<composite-element>
代替熟悉的<element>
代码。
如何使用Castle ActiveRecord属性执行此操作?
为了扩展Mauricio的答案,正确的映射是这样的:
[ActiveRecord]
public class TrackLog
{
[Property]
public string Name { get; set; }
[HasMany(DependentObjects = true,
MapType = typeof(TrackPoint),
Table = "TrackPoint",
ColumnKey = "TrackLog_Id"
)]
public ISet<TrackPoint> TrackPoints { get; set; }
}
除了MapType
之外,您还必须提供Table
,ColumnKey
和DependentObjects
属性。
MapType
:您要映射到的类的类型
Table
:组件列表数据库中表的名称
ColumnKey
:用于将子项与父项
您无法将Set
用作RelationType
。它会导致NHibernate表现出一些奇怪的行为,它会保存实体,删除它们,并重新保存每个元素的两个副本。对于我的TrackLog
,它保存了25 TrackPoints
,删除了它们,然后再次保存25 TrackPoints
两次,共计50次。然后SessionScope
处置后,它又保存了25个,共计75 TrackPoints
而不是预期的25.我找不到这个问题的根源,但修复是为了避免使用Set
并使用Bag
(或其他内容,我只用Bag
进行了测试)。
答案 0 :(得分:0)
使用DependentObjects = true
,例如:
public class TrackLog {
[Property]
public string Name { get; set; }
[HasMany(DependentObjects = true)]
public ISet<TrackPoint> TrackPoints { get; set; }
}