NHibernate映射对象使用相同的Id多个表?

时间:2012-01-19 16:35:36

标签: c# nhibernate nhibernate-mapping

我正在寻找以下内容,想象一下你有一个对象的场景:

public class ObjectA {
    public virtual Guid Id;
    public virtual string PropertyA;
    public virtual string PropertyB;
    public virtual string PropertyC;
    public virtual string PropertyD;
}

由于我不会进入的原因,数据库需要看起来像这样:

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

----
Table: ObjectAExtended
----
Column Id
Column PropertyC
Column PropertyD
----

对象在两个表之间分开,并由相同的Id引用,因此当您调用Session.Save(...时,它将保存到两个表中。

任何想法如何做到这一点或者是否可能?

干杯。

编辑:我已经找到答案,但显然不能再发布7个小时了。明天会更新。

2 个答案:

答案 0 :(得分:2)

我明白了。在NHibernate 3.2中使用代码映射...

public class ObjectAMap : ClassMapping<ObjectA> {
    public ObjectAMap () {
        Table("ObjectABase");
        Id<Guid>(x => x.Id, m => { m.Column("Id"); });
        Property(x => x.PropertyA, map => { map.Column("PropertyA"); });
        Property(x => x.PropertyB, map => { map.Column("PropertyB"); });
        Join("ObjectA",
             m => {
                 m.Table("ObjectAExtended");
                 m.Key(x => { x.Column("Id"); });
                 m.Property<string>(x => x.PropertyC, map => { map.Column("PropertyC"); });
                 m.Property<string>(x => x.PropertyD, map => { map.Column("PropertyD"); });
             });

        }); 
    }
}

答案 1 :(得分:1)

一种可能性是在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>

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

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