Asp.net 使用复合密钥更新NHibernate

Asp.net 使用复合密钥更新NHibernate,asp.net,nhibernate,composite-key,Asp.net,Nhibernate,Composite Key,我的表格定义如下: <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" /

我的表格定义如下:

<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>
许可证 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列时,我得到了ToomAnyRowAffectedException

请告诉我如何在映射级别设置复合键,以便NHibernate可以基于ClientId和类型进行udpate

类似于:updatelicense SET Used=Used-1,其中ClientId='xxx'和Type=1

请帮忙

谢谢,
Mahesh

您必须使用复合id


您必须使用复合id


如果主键是复合键,那么映射应该反映这一点,并且类需要重写
Equals
GetHashCode

此外,如果
ClientId
客户机
实体的主键,则应将其映射为
多对多
,而不仅仅是一个Id

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

另外,为什么要用
access=“field”
映射所有内容?属性是否有一些特殊的逻辑

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


如果主键是复合键,那么映射应该反映这一点,并且类需要重写
Equals
GetHashCode

此外,如果
ClientId
客户机
实体的主键,则应将其映射为
多对多
,而不仅仅是一个Id

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

另外,为什么要用
access=“field”
映射所有内容?属性是否有一些特殊的逻辑

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


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

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

这里有一些关于这个主题的链接,可以帮助您清楚地看到这一点

  • (向下滚动至:拦截器和持久生命周期
  • (因此,质询)

  • 与复合密钥相比,使用拦截器的主要优势在于,它不会破坏您的DBRM,并提供了一个更加灵活的解决方案,而不会“污染”您的映射文件,该文件将更精确地表示您的模型。

    与上面提到的其他同志一样,您必须使用复合id,这不是一个最好但可以接受的做法

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

    这里有一些关于这个主题的链接,可以帮助您清楚地看到这一点

  • (向下滚动至:拦截器和持久生命周期
  • (因此,质询)

  • 与复合密钥相比,使用拦截器的主要优势在于它不会破坏您的DBRM,并提供了一个更灵活的解决方案,而不会“污染”您的映射文件,从而更精确地表示您的模型。

    +1良好的解决方案,映射的可视示例,非常好!)+1个很好的解决方案,以及映射的可视化示例,非常好!=)
    <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>