我正在寻找以下内容,想象一下你有一个对象的场景:
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个小时了。明天会更新。答案 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和继承的基础对象中都已定义,但您的应用程序可能没有实际区别。