2010-02-18 12 views

Respuesta

0

El motivo de este comportamiento es que hace referencia a su colección cuando agrega() un elemento nuevo. Esta referencia activa la carga diferida.

He encontrado que es mejor evitar mapeos explícitos de muchos a muchos en NHibernate. Normalmente uso dos asociaciones de uno a muchos para una tercera entidad, que funciona como una tabla de enlaces. Asegúrese de establecer los muchos lados de la relación en inverso = "verdadero". A continuación, puede realizar directamente:

session.Save(new LinkEntity(leftSideInstanceOrProxy, rightSideInstanceOrProxy);

Otra ventaja es que no hay información acerca de la relación que desea guardar, que también puede ir en la nueva entidad normalmente.

+1

Cuando no se necesita información adicional, este enfoque hace que la persistencia del modelo de dominio dependa de – Paco

+0

Sí, no deseo agregar una clase no relacionada con el negocio a mi modelo para esto. Sin embargo, he hecho un aumento y no puedo hacerlo de otra manera. ¿Estoy en lo cierto al pensar que NHibernate no es compatible con esto? Si es así, ¿alguien sabe por qué no? – JontyMC

+0

¿Qué tal el caché de segundo nivel? – dariol

1

Tuve el mismo problema.

Solo tiene que crear la entidad intermedia y hacer dos relaciones uno a muchos.

Si marcó las declaraciones que genera para actualizar una relación de muchos a muchos, no la usaría de todos modos. Cuando agrega un nuevo artículo a una relación de muchos a muchos la relación en la primera carga (creo que esto genera una declaración de selección), luego actualiza esa relación y realiza una confirmación. Estas cosas suceden:

Delete se realiza para cada objeto de la matriz (tal vez es una instrucción de eliminación o N DELETE, no me acuerdo)

todos los objetos se vuelven a insertar en la base de datos (N insertar declaraciones + el nuevo).

Si realiza muchas actualizaciones de la relación muchos a muchos, la asignación de muchos a muchos no es para usted. Puede usar muchos para muchos en objetos que no cambian o no cambian muy a menudo (debido a todas las eliminaciones y reinserts).

Debe crear 3 objetos (digamos Usuario, Publicación, Voto, que es una tabla de usuario de USER_POST). Crea claves primarias para todas esas tablas (incluso para USER_POST). Cree una clave sustituta y establezca una restricción para USER_ID, POST_ID para ser uniqe para la tabla USER_POST. Correlacionarlo como relaciones normales de uno a muchos, muchos a uno (padre-hijo, padre-hijo) y eso es todo.

1

Si no desea cambiar su modelo de dominio, puede ejecutar SQL directamente para actualizar la tabla de enlace m-m (ya sea utilizando una consulta Nhibernate o ejecutando un proceso almacenado parametrizado).

Además, tenga en cuenta que no podrá utilizar la operación Add() (de lo contrario, NH activará automáticamente la carga lenta). En su lugar, considere llamar a un método con nombre adecuado en su clase Repository.

Cuestiones relacionadas