【发布时间】:2010-04-22 17:09:10
【问题描述】:
我有一个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; }
}
除了DependentObjects 之外,您还必须提供MapType、Table 和ColumnKey 属性。
MapType: 你要映射到的类的类型
Table: 数据库中组件列表的表名
ColumnKey: 用于将子级与父级关联的外键列的名称
更新:
您不能将Set 用作RelationType。它会导致 NHibernate 表现出一些奇怪的行为,它会保存实体,删除它们,然后重新保存每个元素的两个副本。以我的TrackLog为例,它保存了25个TrackPoints,删除它们,然后又保存了25个TrackPoints两次,总共50个。然后当SessionScope被处理掉时,它又保存了25个,总共 75 个 TrackPoints 而不是预期的 25 个。我找不到这个问题的根源,但解决方法是避免使用 Set 并使用 Bag (或其他东西,我只测试过用Bag) 代替。
【问题讨论】:
-
@Daniel:你能把它添加到维基吗? stw.castleproject.org 我从来没有真正使用过 DependentObjects。
标签: c# nhibernate activerecord castle-activerecord