2012-08-28 70 views
0

我試圖找出如何構建我的實體映射實現如下:功能NHibernate - 映射許多一對多的關係爲同一類型的相關實體

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

我想有一個關係表,它具有相關Document的ID對。

現在我正在用這個SO問題中描述的解決方案解決這個問題:Fluent Nhibernate mapping related items(瘋狂的巧合,OP的名字和我一樣)。

我寧願有一個相關項目的單一列表,不必有一個爲RelatedTo和一個爲RelatedFrom。那可能嗎?


爲了澄清,我要解決的問題是,如果我將文檔A關聯到文檔B,我需要文檔A的 RelatedDocuments列表中包含文檔B,文檔B的 RelatedDocuments列表中包含文檔A, 而不必創建兩個關係

回答

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) 
) 

你應該考慮是否需要與關係本身相關的任何數據。在這種情況下,相關集合將是一個RelatedDocument實例的集合,它將相關文檔作爲一個屬性,映射將爲HasMany。

+0

我還沒有嘗試過這一點,但似乎只有我手動重複所有相關實體之間的關係時,建議纔會起作用。爲了澄清我期待的結果,如果我在DocA中添加與DocB和DocC的關係,我希望在DocB的相關列表中看到DocA和DocC,在DocC的列表中看到DocA和DocB等。 –

+0

因此, (http://en.wikipedia.org/wiki/Transitive_relation)和[symmetric](http://en.wikipedia.org/wiki/Symmetric_relation)?意思是,如果A與B和C有關,那麼B和C都與A和彼此有關? – eulerfx

+0

不可傳遞,只是對稱的。因此,如果A與B相關且C與A相關,則與A相關的項目列表將是B,C。 –

相關問題