C# NHibernate是否将对象映射到使用相同Id的多个表?

C# NHibernate是否将对象映射到使用相同Id的多个表?,c#,nhibernate,nhibernate-mapping,C#,Nhibernate,Nhibernate Mapping,我希望执行以下操作,想象一个场景,其中有一个对象: 公共类ObjectA{ 公共虚拟Guid Id; 公共虚拟字符串属性a; 公共虚拟字符串属性b; 公共虚拟字符串属性c; 公共虚拟字符串PropertyD; } 出于我不想讨论的原因,数据库需要如下所示: ---- Table: ObjectABase ---- Column Id Column PropertyA Column PropertyB ---- ---- Table: ObjectAExtended ---- Column I

我希望执行以下操作,想象一个场景,其中有一个对象:

公共类ObjectA{
公共虚拟Guid Id;
公共虚拟字符串属性a;
公共虚拟字符串属性b;
公共虚拟字符串属性c;
公共虚拟字符串PropertyD;
}
出于我不想讨论的原因,数据库需要如下所示:

----
Table: ObjectABase
----
Column Id
Column PropertyA
Column PropertyB
----

----
Table: ObjectAExtended
----
Column Id
Column PropertyC
Column PropertyD
----
该对象在两个表之间拆分,并由相同的Id引用,因此当您调用
Session.Save(…
时,它将保存到两个表中

有人知道怎么做吗,或者如果可能的话

干杯


编辑:我已经找到了答案,但显然在接下来的7个小时内无法发布。明天将更新。

一种可能是在nhibernate映射中使用联接的子类元素。您可以按如下方式布局对象:

public class ObjectABase
{
   public virtual int Id {get; set;}
   public virtual string PropertyA {get; set}  
   public virtual string PropertyB {get; set}  
}

public class ObjectA : ObjectABase
{
   public virtual string PropertyC {get; set}  
   public virtual string PropertyD {get; set}    
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="Company.DomainModel">
  <joined-subclass name="ObjectA" table="ObjectAExtended" extends="Company.DomainModel.ObjectABase" lazy="false">
    <key column="Id" />
    <property name="PropertyC" />
    <property name="PropertyD" />
  </joined-subclass>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Company.DomainModel" assembly="DomainModel">
  <class name="ObjectABase" table="ObjectABase" lazy="false">
    <id name="Id" column="Id">
      <generator class="identity"/>
    </id>
    <property name="PropertyA" />
    <property name="PropertyB" />
  </class>
</hibernate-mapping>
然后您可以按如下方式设置映射:

public class ObjectABase
{
   public virtual int Id {get; set;}
   public virtual string PropertyA {get; set}  
   public virtual string PropertyB {get; set}  
}

public class ObjectA : ObjectABase
{
   public virtual string PropertyC {get; set}  
   public virtual string PropertyD {get; set}    
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="Company.DomainModel">
  <joined-subclass name="ObjectA" table="ObjectAExtended" extends="Company.DomainModel.ObjectABase" lazy="false">
    <key column="Id" />
    <property name="PropertyC" />
    <property name="PropertyD" />
  </joined-subclass>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Company.DomainModel" assembly="DomainModel">
  <class name="ObjectABase" table="ObjectABase" lazy="false">
    <id name="Id" column="Id">
      <generator class="identity"/>
    </id>
    <property name="PropertyA" />
    <property name="PropertyB" />
  </class>
</hibernate-mapping>

通过关闭延迟加载,您可以一次性获得数据库中的所有内容


这并不完全是您在问题中指定的,因为ObjectA的属性在ObjectA和继承的基本对象中都有定义,但对于您的应用程序来说可能没有实际的区别。

我找到了答案。在NHibernate 3.2中,使用代码映射

公共类对象映射:类映射{
公共对象映射(){
表(“对象数据库”);
Id(x=>x.Id,m=>{m.Column(“Id”);});
属性(x=>x.PropertyA,map=>{map.Column(“PropertyA”);});
属性(x=>x.PropertyB,map=>{map.Column(“PropertyB”);});
加入(“ObjectA”,
m=>{
m、 表(“ObjectAExtended”);
m、 键(x=>{x.Column(“Id”);});
m、 属性(x=>x.PropertyC,map=>{map.Column(“PropertyC”);});
m、 属性(x=>x.PropertyD,map=>{map.Column(“PropertyD”);});
});
}); 
}
}
试试这个: