【问题标题】:What is the equivalent of <composite-element> in Castle ActiveRecord?Castle ActiveRecord 中的 <composite-element> 等价物是什么?
【发布时间】: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 页:

组件的集合与其他值类型实例的集合类似地映射。唯一的区别是使用&lt;composite-element&gt; 代替熟悉的&lt;element&gt; 标签。

我将如何使用 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 之外,您还必须提供MapTypeTableColumnKey 属性。

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


【解决方案1】:

使用DependentObjects = true,例如:

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

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

【讨论】:

  • 谢谢毛里西奥,你是救命稻草 :)。
  • 你负责Castle ActiveRecord官方文档吗?我相信这会很好地添加到关于映射组件的部分。
  • +1。顺便说一句,任何人都可以为 Castle 的文档做出贡献。你也是丹尼尔:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2014-05-08
  • 2014-06-12
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多