【问题标题】:NHibernate update using composite keyNHibernate 使用复合键更新
【发布时间】:2010-05-11 16:13:58
【问题描述】:

我有一个表格定义如下:

许可证

ClientId
Type
Total
Used

ClientId 和 Type 一起唯一标识一行。我有一个映射文件,如下所示:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
  <class name="Acumen.AAM.Domain.Model.License, Acumen.AAM.Domain" lazy="false" table="License">
<id name="ClientId" access="field" column="ClientID" />
<property name="Total" access="field" column="Total"/>
<property name="Used" access="field" column="Used"/>
<property name="Type" access="field" column="Type"/>
  </class>
</hibernate-mapping>

如果客户使用许可证创建用户,我需要更新表中的 Used 列。当我在映射 xml 中将 ClientId 列设置为该表的 id 列时,我得到了 TooManyRowsAffectedException。

能否请您告诉我如何在映射级别设置复合键,以便 NHibernate 可以根据 ClientId 和 Type 进行更新。

类似于:Update License SET Used=Used-1 WHERE ClientId='xxx' AND Type=1

请帮忙。

谢谢, 马赫什

【问题讨论】:

    标签: asp.net nhibernate composite-key


    【解决方案1】:
    【解决方案2】:

    如果您的主键是复合的,您的映射应该反映这一点,并且您的类需要覆盖 EqualsGetHashCode

    另外,如果ClientId 是您的Client 实体的主键,您应该将其映射为many-to-many,而不仅仅是一个Id。

    另外,你为什么要指定lazy="false"?您知道其中的含义吗?

    另外,为什么要使用access="field" 映射所有内容?属性有什么特殊的逻辑吗?

    考虑到我刚刚写的所有内容,这是一个修改后的映射。随意忽略那些不适用的部分:-)

    <class name="Acumen.AAM.Domain.Model.License, Acumen.AAM.Domain" table="License">
      <composite-id>
        <key-many-to-one name="Client" column="ClientID" />
        <key-property name="Type" />
      </composite-id>
      <property name="Total" />
      <property name="Used" />
    </class>
    

    【讨论】:

    • +1 很好的解决方案,以及映射的可视化示例,非常棒! =)
    【解决方案3】:

    和上面提到的其他同志一样,您必须使用复合ID,这不是最佳但可以接受的做法。

    另一方面,您可以简单地写一个 update interceptor 并确保其中的 Type = 1。

    这里有一些关于这个主题的链接,可以帮助你看清楚。

    1. Elegant code : Implementing NHibernate Interceptors
    2. NHibernate Documentation : Interceptors
    3. Sample NHibernate IInterceptor implementation
    4. Enterprise .NET Community : NHibernate Part 2(向下滚动到:拦截器和持久性生命周期
    5. NHibernate Interceptor Auditing Inserted Object Id(所以问题)

    在复合键上使用拦截器的主要优点是它不会破坏您的 DBRM 并提供绝对更灵活的解决方案,而不会“污染”您的映射文件,这将更准确地表示您的模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多