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,

我有以下需要在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,
  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; }
     }     
}
  • “工作区”或“元素”可以有多个“附件”文件,“附件”文件可以由多个“工作区”或“元素”引用

  • “工作区”或“元素”可以引用同一个“附件”文件

因此,“附件”和“工作区”或“元素”之间的关系存储在“objectattachment”中 “表,其中:

  • “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(最新版本)