我有以下表和實體,需要在流利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」創建單獨的「附件」表) 。
問候, 泉
親愛的FIRO, 我曾嘗試使用您的解決方案,但沒有一個id列c .ReferencesAny方法。我使用FH 1.3.0.717版以及NHibernate 3.2(最新版)。 – Quan 2012-03-06 03:37:03
hmm在Component方法中看起來像是一場失敗,並且ComponentMap <>類將被編輯 – Firo 2012-03-06 08:34:48