0

我有以下表和實體,需要在流利NHibernate中映射。流利NHibernate:如何映射與鑑別器的多對多關係

表:

CREATE TABLE workarea 
(
    id uuid NOT NULL, 
    name character varying(255) NOT NULL, 
    CONSTRAINT pk_workarea PRIMARY KEY (id), 
) 

CREATE TABLE element 
(
    id uuid NOT NULL, 
    name character varying(255) NOT NULL, 
    CONSTRAINT pk_element PRIMARY KEY (id), 
) 

CREATE TABLE attachment 
(
    id uuid NOT NULL, 
    filename character varying(255) NOT NULL, 
    CONSTRAINT pk_attachment PRIMARY KEY (id), 
) 

CREATE TABLE objectattachment 
(
    id uuid NOT NULL, 
    attachmentid uuid NOT NULL, 
    attachmenttype string NOT NULL, 
    objectid uuid NOT NULL, 
    CONSTRAINT pk_objectattachment PRIMARY KEY (id), 
    CONSTRAINT fk_oa_a FOREIGN KEY (attachmentid) 
     REFERENCES attachment (id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT, 
    CONSTRAINT fk_oa_at FOREIGN KEY (attachmenttypeid) 
     REFERENCES attachmenttype (id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 

下,該數據庫的設計理念如下:

  • A「工作區」或「元素」可以有多個「附件」文件和「附件「文件可以被幾個」workarea「或」元素「引用。

  • 「工作區」或「元素」可以指代相同的「附件」文件。

因此, 「附接」 S和 「工作區」 S或 「元件」 之間的關係被存儲在 「objectattachment 」 表,在其中:

  • 「附件ID」 字段指特定「附件」的標識符。

  • 「附件類型」字段(鑑別器)定義此關係 是在「附件」和「工作區」之間還是在「附件」和「附件」和「元件」之間。

  • 「objectid」字段是指特定「workarea」或「元素」的標識符,具體取決於上述「attachmenttype」字段的值。

基於數據庫的設計,我再定義域模型類,如下所示:

public class WorkArea  
{ 
    private Guid _id = Guid.Empty; 
    private string _name; 
    public virtual Guid Id  
    { 
      get { return _id ; } 
      set { _id = value; } 
    } 
    public virtual string Name  
    { 
      get { return _name ; } 
      set { _name = value; } 
    } 
} 

public class Element  
{ 
    private Guid _id = Guid.Empty; 
    private string _name; 
    public virtual Guid Id  
    { 
      get { return _id ; } 
      set { _id = value; } 
    } 
    public virtual string Name  
    { 
      get { return _name ; } 
      set { _name = value; } 
    } 
} 

public class Attachment 
{ 
    private Guid _id = Guid.Empty; 
    private string _fileName; 
    public virtual Guid Id  
    { 
      get { return _id ; } 
      set { _id = value; } 
    } 
    public virtual string FileName  
    { 
      get { return _fileName; } 
      set { _fileName= value; } 
    } 
} 

public class WorkAreaAttachment : Attachment 
{ 
    private WorkArea _workArea; 
    public virtual WorkArea WorkArea 
    { 
      get { return _workArea; } 
      set { _workArea = value; } 
    }  
} 

public class ElementAttachment : Attachment 
{ 
    private Element _element; 
    public virtual Element Element 
    { 
      get { return _element; } 
      set { _element = value; } 
    }  
} 

現在我的問題是我是否能與上面的數據庫設計這些映射域模型類。如果是的話,那我該怎麼做?如果不是,那麼如何更改領域模型類以支持對設計數據庫的Fluent NHibernate映射,因爲我不想更改當前的數據庫設計(即爲「workarea」和「element」創建單獨的「附件」表) 。

問候, 泉

回答

0
public class AttachmentLink 
{ 
    private Attachment _attachment; 
    public virtual Attachment Parent 
    { 
      get { return _attachment; } 
      set { _attachment = value; } 
    } 

    private IHasAttachments _linkedTo; 
    public virtual IHasAttachments LinkedTo 
    { 
      get { return _linkedTo; } 
      set { _linkedTo = value; } 
    } 
} 

// in AttachmentMap 
HasMany(x => x.Links) 
    .Table("objectattachment"); 

// map the component 
sealed class AttachmentLinkMap : ComponentMap<AttachmentLink> 
{ 
    public AttachmentLinkMap() 
    { 
     References(x => x.Attachment, "attachmentid"); 
     ReferencesAny(x => x.LinkedTo) 
      .IdentityType<Guid>() 
      .EntityIdentifierColumn("objectid") 
      .EntityTypeColumn("attachmenttype") 
      .AddMetaValue<WorkArea>(typeof(WorkArea).Name.ToLower()) 
      .AddMetaValue<Element>(typeof(Element).Name.ToLower()) 
      .Not.LazyLoad(); // to prevent false proxies 
    } 
} 


// in ElementMap, and almost the same in WorkAreaMap 
HasManyToMany(x => x.Attachments) 
    .Where("attachmenttype='element'") 

注:因爲沒有你不需要在鏈接表

+0

親愛的FIRO, 我曾嘗試使用您的解決方案,但沒有一個id列c .ReferencesAny方法。我使用FH 1.3.0.717版以及NHibernate 3.2(最新版)。 – Quan 2012-03-06 03:37:03

+0

hmm在Component方法中看起來像是一場失敗,並且ComponentMap <>類將被編輯 – Firo 2012-03-06 08:34:48

相關問題