【问题标题】:Is navigation through composite-id's key-many-to-one possible?是否可以通过复合 ID 的键多对一进行导航?
【发布时间】:2010-11-19 14:25:15
【问题描述】:

是否可以在 Nhibernate 中浏览复合 ID 的键多对一关联?

我使用以下设置映射了一些(旧)表:

<class name="StructureUser">
    <composite-id>
        <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
        <key-many-to-one name="User" class="User" column="USERID" />
    </composite-id>
    ...
</class>

<class name="Structure">
    <id name="Id" column="id" type="Int32" >
        <generator class="native"/>
    </id>
    <property name="Low" column="low" type="Int32" />
    ...
</class>

我想通过查询中的 StructureUser 类访问 Structure 的“Low”属性。我尝试了我能想到的 Criteria API 的所有用法,但总是出错。以下是我尝试的两个查询:

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
    .CreateAlias("Structure", "struc")
    .Add(Restrictions.Le("struc.Low", 123));

ICriteria crit2 = Session.CreateCriteria(typeof(StructureUser))
    .Add(Restrictions.Le("Structure.Low", 123));

crit1 中的错误来自数据库并说“struc_1.Low 在此上下文中无效”,因为 NHibernate 不会生成 sql 命令中的限制所需的连接。 crit2 中的错误来自 NHibernate,告诉我它无法访问 StructureUser 上的“Structure.Low”属性。

我通过使用 key-property 元素声明复合 ID 并声明与普通多对一元素的关系来解决这个问题。

这个问题还有其他解决方案吗?

【问题讨论】:

  • 我遇到了类似的问题。

标签: c# nhibernate join composite-id


【解决方案1】:

你试过了吗

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
    .CreateCriteria("Structure", "struc")
    .Add(Restrictions.Le("struc.Low", 123));

【讨论】:

  • 我不记得了:)。下周我回来工作时必须尝试一下。
  • 好吧,我花了一年多的时间,但我终于测试了它。不幸的是,您的建议也不起作用:(。
  • 您也可以尝试使用 .CreateAlias("id.Structure", "struc") 创建别名,注意为抽象 id 属性保留的小写“id”。另一方面,我发现对于 Composite-Id 的 Component 类路由更容易使用,但在所有级别上都更加冗长
【解决方案2】:

我也遇到过类似的问题。

正如原发帖者所说,您需要从要别名的复合键中添加多对一关系,并且您需要将属性“插入”和“更新”设置为“假”。

然后你可以把它保存在composite-id中,你不需要把它改成key-property元素。

<class name="StructureUser">
<composite-id>
    <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
    <key-many-to-one name="User" class="User" column="USERID" />
</composite-id>

<many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" insert="false" update="false" />

...

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2017-08-09
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多