【问题标题】:How do I map a n-column primary key with nHibernate如何使用 nHibernate 映射 n 列主键
【发布时间】:2011-11-25 13:34:18
【问题描述】:

我有一个包含 2 列作为 PK(复合主键)的表。

如何将它们映射到hbm.xml 中的“Id”?

<id name="A" />  

如何使用流利的 nhibernate 来做到这一点?

【问题讨论】:

    标签: .net nhibernate fluent-nhibernate composite-primary-key


    【解决方案1】:

    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");
        }
    }
    

    【讨论】:

    • 引用不再起作用。最好在此处复制答案,由参考文献支持,而不是仅使用参考文献。
    【解决方案2】:

    对于 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>
    

    然后您应该重写 EqualsGetHashCode 方法,以便 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")
    }
    

    【讨论】:

      【解决方案3】:

      为 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>  
      

      希望对您有所帮助...:-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 2011-04-21
        • 1970-01-01
        • 2011-05-07
        • 2011-05-29
        • 2016-05-16
        • 2013-03-26
        相关资源
        最近更新 更多