Pregunta

Tengo una definición de tabla como se indica a continuación:

Licencia

ClientId
Type
Total
Used

ClientId y Type juntos identifican de forma única una fila.Tengo un archivo de mapeo como se indica a continuación:

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

Si un cliente usó una licencia para crear un usuario, necesito actualizar la columna Usado en la tabla.Cuando configuro la columna ClientId como la columna de identificación para esta tabla en el xml de mapeo, obtengo TooManyRowsAffectedException.

¿Podría decirme cómo configurar una clave compuesta en el nivel de mapeo para que NHibernate pueda actualizar según ClientId y Type?

Algo como:Actualizar licencia SET Usado=Usado-1 DONDE ClientId='xxx' Y Tipo=1

Por favor ayuda.

Gracias Mahesh

¿Fue útil?

Solución

Si su clave principal es compuesta, su mapeo debería reflejar eso y su clase debe anularla Equals y GetHashCode.

También si ClientId es la clave principal de su Client entidad, debe asignarla como many-to-many, no solo una identificación.

Además, ¿por qué especificas? lazy="false"?¿Eres consciente de las implicaciones?

Además, ¿por qué mapear todo con access="field"?¿Las propiedades tienen alguna lógica especial?

Este es un mapeo revisado considerando todo lo que acabo de escribir.Siéntete libre de ignorar aquellas partes que no aplican :-)

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

Otros consejos

Como los otros camaradas mencionados anteriormente, debe utilizar una identificación compuesta, que no es la mejor práctica, pero es aceptable.

Por otro lado, puedes simplemente escribir un interceptor de actualización y asegúrese de que su Tipo = 1 dentro de él.

Aquí hay algunos enlaces sobre el tema para ayudarlo a ver esto con claridad.

  1. Código elegante:Implementación de interceptores NHibernate
  2. Documentación de NHibernate:Interceptores
  3. Ejemplo de implementación de NHibernate IInterceptor
  4. Comunidad .NET empresarial:NHibernate Parte 2 (Desplácese hacia abajo hasta: Interceptores y ciclo de vida persistente)
  5. ID del objeto insertado de auditoría del interceptor NHibernate (entonces pregunta)

La principal ventaja de usar interceptores sobre una clave compuesta es que no rompe su DBRM y proporciona una solución definitivamente más flexible, sin "contaminar" su archivo de mapeo que representará con mayor precisión su modelo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top