【问题标题】:Fluent NHibernate - Mapping many-to-many relationship for related entities of the same typeFluent NHibernate - 为相同类型的相关实体映射多对多关系
【发布时间】:2012-08-30 05:02:41
【问题描述】:

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

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

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

现在我正在使用这个 SO 问题中描述的解决方案来解决这个问题:Fluent Nhibernate mapping related items(很巧合,OP 的名称与我的相同)。

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


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

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案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)
    )
    

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

    【讨论】:

    • 我没有尝试过,但似乎只有在我手动复制所有相关实体之间的关系时,该建议才有效。为了澄清我正在寻找的结果,如果我从 DocA 添加到 DocB 和 DocC 的关系,我想在 DocB 的相关列表中查看 DocA 和 DocC,在 DocC 的列表中查看 DocA 和 DocB 等。
    • transitivesymmetric 的关系也是如此吗?意思是,如果 A 与 B 和 C 相关,那么 B 和 C 都与 A 相关并且彼此相关?
    • 不是传递的,只是对称的。因此,如果 A 与 B 相关,C 与 A 相关,则与 A 相关的项目列表将是 B,C。
    • 在这种情况下,您必须复制关系。换句话说,DocumentRelations 表必须为关系的每一方都有一条记录。我已经更新了相同的代码以包含一个 RelateTo 方法,这将确保两个关系都保持不变。
    • 这是一个可行的解决方案。我希望有一种方法可以让 NHibernate 使用这样的 SQL 解决方案:stackoverflow.com/questions/474119/…,但我认为 NH 不喜欢这样的联合,而且我认为视图在这种情况下不会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2019-11-28
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多