¿Cómo se puede eliminar una entidad en la que tenga nhibernate sólo su ID y escribir?

StackOverflow https://stackoverflow.com/questions/1323427

  •  19-09-2019
  •  | 
  •  

Pregunta

Me pregunto ¿cómo se puede eliminar una entidad que tenga sólo su ID y tipo (como en la cartografía) usando NHibernate 2.1?

¿Fue útil?

Solución

Si está utilizando la carga diferida, carga sólo crea un proxy.

session.Delete(session.Load(type, id));

Con NH 2.1 se puede usar HQL. No estoy seguro de cómo realmente se parece, pero algo como esto: Nota que esto está sujeto a la inyección SQL - si es posible utilizar parametrizada consultas lugar con setParameter ()

session.Delete(string.Format("from {0} where id = {1}", type, id));

Editar

Para operaciones de carga, no es necesario conocer el nombre de la columna de Id.

Si lo que necesita saber que, lo puede conseguir por los metadatos NH:

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

Otra edición.

session.Delete() está instanciando la entidad

Cuando se utiliza Session.delete (), NH carga la entidad de todos modos. Al principio no me gusta. Entonces me di cuenta de las ventajas. Si la entidad es parte de una estructura compleja mediante la herencia, colecciones o "ninguna" -references, en realidad es más eficiente.

Por ejemplo, si A clase y B tanto heredan de Base, que no trata de eliminar datos de B mesa cuando la entidad real es de tipo A. Esto no sería posible sin la carga del objeto real. Esto es particularmente importante cuando hay muchos tipos heredados que también constan de muchas mesas adicionales cada uno.

La misma situación se da cuando se tiene una colección de Bases, que resultan ser todas las instancias de A. Al cargar la colección en la memoria, NH sabe que no es necesario para eliminar cualquier B-cosas.

Si el A entidad tiene una colección de Bs, que contiene Cs (y así sucesivamente), que no trata de eliminar cualquier Cs cuando la colección de Bs está vacía. Esto sólo es posible cuando la lectura de la colección. Esto es particularmente importante cuando C es complejo en sí mismo, agregando incluso más tablas y así sucesivamente.

Cuanto más complejo y dinámico de la estructura es, más eficiente es que se cargue de datos real en lugar de "a ciegas" eliminarlo.

HQL Elimina tener trampas

HQL elimina para no cargar datos en la memoria. Pero HQL-eliminaciones no son tan inteligentes. Básicamente, traducen el nombre de la entidad a nombre de la tabla correspondiente y eliminar que a partir de la base de datos. Además, se elimina algo de la recopilación de datos agregada.

En las estructuras simples, esto puede funcionar bien y eficiente. En estructuras complejas, no todo se borra, lo que lleva a la restricción violaciónes o "pérdidas de memoria de base de datos".

Conclusión

I también trató de optimizar su eliminación con NH. Me di por vencido en la mayoría de los casos, ya que NH es aún más inteligente, que "simplemente funciona" y es por lo general lo suficientemente rápido. Uno de los más complejos algoritmos de borrado que escribí está analizando definiciones de asignación de NH y la construcción de borrar frases de aquella. Y - no es una sorpresa - no es posible sin necesidad de leer los datos de la base de datos antes de eliminar. (Yo sólo lo redujo sólo para cargar las claves primarias.)

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