流畅的NHibernate - 为相同类型的相关实体映射多对多关系

时间:2012-08-28 19:53:57

标签: nhibernate fluent-nhibernate

我正在试图弄清楚如何构建我的实体映射以实现以下目的:

public class Document
{
    public virtual string Name { get; set; }
    // Other properties
    public IList<Document> RelatedDocuments { get; set; }
}

我想要一个关系表,其中包含相关Document s的ID对。

现在我正在用这个SO问题中描述的解决方案来解决这个问题:Fluent Nhibernate mapping related items(疯狂的巧合,OP的名字和我的名字一样)。

我宁愿拥有一个相关项目列表,也不一定要有一个RelatedTo和一个RelatedFrom。那可能吗?

<小时/> 为了澄清,我想要解决的问题是,如果我将文档A与文档B相关联,我需要文档A的RelatedDocuments列表中包含文档B,文档B的RelatedDocuments列表需要文档A,,无需创建两个关系

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

class Document
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Document> Related { get; set; }

    public void RelateTo(Document other) 
    {
      this.Related.Add(other);
      other.Related.Add(this);
    }
}

class DocumentMap : FluentNHibernate.Mapping.ClassMap<Document>
{
    public DocumentMap()
    {
        Table("Documents");
        Id(x => x.Id);
        Map(x => x.Name);
        HasManyToMany(x => x.Related)
            .Table("DocumentRelations")
            .ParentKeyColumn("DocumentId")
            .ChildKeyColumn("RelatedDocumentId");
    }
}

DocumentRelations表是关联表,指定RelatedDocumentIdDocumentId相关。表格如下:

create table Documents
(
  Id int identity primary key clustered,
  Name varchar(100)
)

create table DocumentRelations
(
 DocumentId int,
 RelatedDocumentId int,
 primary key clustered (DocumentId,RelatedDocumentId)
)

您应该考虑是否需要与关系本身相关的任何数据。在这种情况下,相关集合将是RelatedDocument实例的集合,它将相关文档作为属性,映射将是HasMany。