Castle ActiveRecord中<composite-element>的等价物是什么?</composite-element>

时间:2010-04-17 02:35:44

标签: c# nhibernate activerecord castle-activerecord

我有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之外,您还必须提供TableColumnKeyDependentObjects属性。

MapType:您要映射到的类的类型

Table:组件列表数据库中表的名称

ColumnKey:用于将子项与父项

相关联的外键列的名称

更新

您无法将Set用作RelationType。它会导致NHibernate表现出一些奇怪的行为,它会保存实体,删除它们,并重新保存每个元素的两个副本。对于我的TrackLog,它保存了25 TrackPoints,删除了它们,然后再次保存25 TrackPoints两次,共计50次。然后SessionScope处置后,它又保存了25个,共计75 TrackPoints而不是预期的25.我找不到这个问题的根源,但修复是为了避免使用Set并使用Bag(或其他内容,我只用Bag进行了测试)。

1 个答案:

答案 0 :(得分:0)

使用DependentObjects = true,例如:

public class TrackLog {
   [Property]
   public string Name { get; set; }

   [HasMany(DependentObjects = true)]
   public ISet<TrackPoint> TrackPoints { get; set; }
}