0

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

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

我想要一个包含相关Documents 的 ID 对的关系表。

现在我正在使用这个 SO 问题中描述的解决方案来解决这个问题:Fluent Nhibernate 映射相关项目(疯狂的巧合,OP 的名称与我的相同)。

我宁愿有一个相关项目的列表,而不必有一个 forRelatedTo和一个 for RelatedFrom。那可能吗?


澄清一下,我要解决的问题是,如果我将文档 A 与文档 B 相关联,我需要文档 A 的RelatedDocuments列表中包含文档 B,并且文档 B 的RelatedDocuments列表中包含文档 A,而无需创建两个关系

4

1 回答 1

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表是指定RelatedDocumentId与 相关的关联表DocumentId。这些表看起来像:

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

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

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

于 2012-08-28T23:51:57.573 回答