【发布时间】:2011-11-25 13:34:18
【问题描述】:
我有一个包含 2 列作为 PK(复合主键)的表。
如何将它们映射到hbm.xml 中的“Id”?
<id name="A" />
如何使用流利的 nhibernate 来做到这一点?
【问题讨论】:
标签: .net nhibernate fluent-nhibernate composite-primary-key
我有一个包含 2 列作为 PK(复合主键)的表。
如何将它们映射到hbm.xml 中的“Id”?
<id name="A" />
如何使用流利的 nhibernate 来做到这一点?
【问题讨论】:
标签: .net nhibernate fluent-nhibernate composite-primary-key
NHibernate 文档描述了如何使用和映射composite-id。
您也可以使用component as compositeid。
对于 Fluent NHibernate:
public class ClassNameMap: ClassMap<ClassName>
{
public ClassNameMap()
{
CompositeId().
.KeyReference(x => x.A, "A")
.KeyReference(x => x.B, "B");
}
}
【讨论】:
对于 nHibernate 中的复合主键,我建议;
对于 hbm.xml:
<hibernate-mapping>
<class table="TableName" name="Namespace.ClassName, ClassName">
<composite-id>
<key-property name="IdPropertyOne" column="ColumnOne" />
<key-property name="IdPropertyTwo" column="ColumnTwo" />
</composite-id>
<property name="PropertyName" column="ColumnName" type="String"></property>
</class>
</hibernate-mapping>
然后您应该重写 Equals 和 GetHashCode 方法,以便 nHibernate 知道如何比较您的新密钥并识别不同的对象。这取决于你愿意走多远,你也可以使用“key-many-to-one”在这些上映射外键。
对于多对一键:
<key-many-to-one name="PropertyOneObjName" column="ColumnOne" class="PropertyOneClassName">
对于流畅的休眠,复合键如下所示:
public ClassName(){
CompositeId().
KeyProperty(x => x.IdPropertyOne,"ColumnOne")
KeyProperty(x => x.IdPropertyTwo,"ColumnTwo")
}
【讨论】:
为 NHibernate 试试这个...
<composite-id name="Key" class="KeyClass">
<key-many-to-one name="first" column="firstColumn" lazy="proxy" class="FirstClass"/>
<key-many-to-one name="second" column="secondColumn" lazy="proxy" class="SecondClass"/>
</composite-id>
对于流畅的休眠
<composite-id>
<key-property type="Int32" name="first" column="firstColumn" />
<key-property type="Int32" name="second" column="secondColumn" />
</composite-id>
希望对您有所帮助...:-)
【讨论】: