流利的Nhibernate映射相关项目

时间:2010-06-11 16:41:52

标签: c# fluent-nhibernate mapping

我正在尝试关联2个项目。我有一个表只是一个Id字段,然后有2列用于项目ID的关联。我希望它是一种双向关系 - 也就是说,如果项目在表格中出现两次,我只想要一个关系连接回来。

所以,这是我的项目:

public class Item
{
   public virtual Guid ItemId {get; set;}

   public virtual string Name {get; set;}

   public virtual IList<Item> RelatedItems {get; set;}
}

关于项目的表格如下:

CREATE TABLE RelatedItems
(
   RelatedItemId   uniqueidentifier   DEFAULT(NEWID()) NOT NULL,
   ItemId          uniqueidentifier   NOT NULL,
   RelatedId       uniqueidentifier   NOT NULL,

   CONSTRAINT PK_RelatedItems PRIMARY KEY CLUSTERED (RelatedItemId)
)

映射此连接的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您需要使用“HasMany”映射。我认为以下内容可能有效:

public class Item : ClassMap<Item>
{
  Id(x=>x.Id)
    .Column("ItemId");

  Map(x=>x.Name);

  HasMany(x=>x.RelatedItems)
    .KeyColumn("RelatedId")
    .Table("RelatedItems")
    .LazyLoad()
    .AsList();    
}

您始终可以使用Id字段的约定。并考虑HasMany集合上的级联删除选项。

答案 1 :(得分:0)

我必须这么做(阅读HACK)。

HasManyToMany(x => x.RelatedTo)
                .Table("RelatedItems")
                .ParentKeyColumn("ItemId")
                .ChildKeyColumn("RelatedItemId");

HasManyToMany(x => x.RelatedToMe)
                .Table("RelatedItems")
                .ChildKeyColumn("ItemId")
                .ParentKeyColumn("RelatedItemId");

然后在我的班级中我有一个名为RelatedItems的只读集合,它连接两个列表并选择要返回的不同项目。