【问题标题】:Relationships in nHibernate using simple columns, not PKsnHibernate 中的关系使用简单的列,而不是 PK
【发布时间】:2010-07-05 08:25:43
【问题描述】:

我有一个包含这些列的表 T1:

  • ID (int) - 是主键
  • Ref (int) - (not null)
  • 名称(字符串)

还有一个带有列的第二个表 T2:

  • T2ID (int) - 是主键
  • 值1(整数)
  • 值2(整数)
  • SomeOtherData (int)

T1 中的每条记录在 T2 中都有 >2 条记录:T1 中的 Ref 列具有来自 T2 表 T2ID 列的值。

如何为这种情况编写映射文件? 目前我使用这个:

<class name="Class1" table="T1" >
    <id name="ID" column="ID">
        <generator class="increment"/>
    </id>
    <property name="Name"/>

        <set name="Data" inverse="true" fetch="select">
            <key>
                <column name="T2ID"/>
            </key>
            <one-to-many class="Class2"/>
        </set>
</class>

<class name="Class2" table="T2" >
    <id name="ID" column="T2ID">
        <generator class="increment"/>
    </id>
    <property name="Value1"/>
    <property name="Value2"/>
    <property name="SomeOtherData"/>
</class>

在代码中我有这个来为 T1 加载 T2 数据:

NHibernateUtil.Initialize( class1.Data );

生成此 SQL:

SELECT 
T2ID, Value1, Value2, SomeOtherData
FROM T2
WHERE T2ID = <**an ID column from T1 for which I'm loading T2 data!**>

问题是如何告诉 nHibernate 使用 Ref 列中的值来加载 Data 属性,而不是 PK?

干杯, 亚历克斯

【问题讨论】:

    标签: nhibernate mapping


    【解决方案1】:

    据我所知,这不受支持。 property-ref 元素允许您从“多”端映射这种类型的关系,但没有等效的映射“一”端。

    一种解决方法是为 T1 创建一个包含 T2ID 的视图并映射它而不是表。

    【讨论】:

    • 一个问题是我必须更新这两个表...我知道这一点,但似乎我将不得不使用存储过程:(
    • 您使用的是什么数据库?如果视图有 PK,SQL Server 和可能的其他服务器允许插入和更新视图。
    • 我们正在使用 SQL Server 2005 SP3,但正在研究 SQLLite 替代品。找到了一个不太好的解决方案,但至少它有效:创建了一个表 T3,它有一个列 - T3ID,T1 中的 Ref 是 T3.T3ID 列的 FK,T3ID 与 T2 表在 T2ID 列中的数据相同. Class1 有一个包装 T3 表的 BaseData 属性,而 BaseData 有 Data 属性。
    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多