Fluent nhibernate Fluent NHibernate:如何使用鉴别器映射多对多关系
我有以下需要在Fluent NHibernate中映射的表和实体 表:Fluent nhibernate Fluent NHibernate:如何使用鉴别器映射多对多关系,fluent-nhibernate,many-to-many,fluent-nhibernate-mapping,discriminator,Fluent Nhibernate,Many To Many,Fluent Nhibernate Mapping,Discriminator,我有以下需要在Fluent 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,
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
)
本数据库设计的思路如下:
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; }
}
}
- “工作区”或“元素”可以有多个“附件”文件,“附件”文件可以由多个“工作区”或“元素”引用
- “工作区”或“元素”可以引用同一个“附件”文件
- “attachmentid”字段是指特定“附件”的标识符
- “attachmenttype”字段(鉴别器)定义此关系 介于“附件”和“工作区”之间或介于“附件”和“工作区”之间 “元素”s
- “objectid”字段是指特定“工作区”或“元素”的标识符,具体取决于上述“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映射,因为我不想更改当前数据库设计(即为“工作区”和“元素”创建单独的“附件”表)
问候,,
Quan公共类附件链接
{
私人依恋(私人依恋);;
公共虚拟附件父级
{
获取{return\u attachment;}
设置{u attachment=value;}
}
私人ihasaattachments_linkedTo;
公共虚拟IHasAttachments链接到
{
获取{return\u linkedTo;}
设置{u linkedTo=value;}
}
}
//附件地图
HasMany(x=>x.Links)
.表格(“对象附件”);
//映射组件
密封类AttachmentLinkMap:ComponentMap
{
公共附件LinkMap()
{
参考文件(x=>x.附件,“附件”);
引用任意(x=>x.LinkedTo)
.IdentityType()
.EntityIdentifierColumn(“objectid”)
.EntityTypeColumn(“附件类型”)
.AddMetaValue(typeof(WorkArea).Name.ToLower())
.AddMetaValue(typeof(Element).Name.ToLower())
.Not.LazyLoad();//防止错误代理
}
}
//在ElementMap中,和在WorkAreaMap中几乎相同
HasManyToMany(x=>x.Attachments)
.Where(“attachmenttype='element'))
注意:链接表中不需要Id列亲爱的Firo,我尝试过使用您的解决方案,但失败了,因为没有c.ReferencesAny方法。我使用FH版本1.3.0.717和NHibernate 3.2(最新版本)