Soy nuevo en nHibernate y estoy tratando de familiarizarme con la forma correcta de actualizar los objetos desprendidos de una aplicación web desde el POST. (Estamos utilizando ASP.NET MVC)¿Cuál es la forma correcta de actualizar una entidad nhibernate desde un método de acción POST asp.net?
El objeto que estoy tratando de actualizar contiene (entre otras cosas) un IList de objetos secundarios, asigna algo como esto:
<bag name="PlannedSlices" inverse="true" cascade="all-delete-orphan">
<key column="JobNumber" />
<one-to-many class="SliceClass" />
</bag>
Hemos organizado nuestra MVC edita el formulario de vista para que cuando se publique de nuevo, nuestro método de acción se pase a un objeto (incluida la Lista <> de elementos secundarios. Nosotros redirigimos todos los ID de la entidad correctamente a través del formulario
Nuestro ingenuo intento de el método de post-acción hace una session.SaveOrUpdate (parentObject), con el parentObject que ha sido eliminado de la vista por el modo predeterminado Encuadernador.
Esto parece funcionar bien para cualquiera de los siguientes escenarios:
- Creación de un nuevo objeto padre
- Modificación de las propiedades de los padres
- Adición de nuevos objetos secundarios
- Modificación niño objetos existentes (En cuanto a los registros de nHibernate, puedo ver que establece correctamente si los objetos son nuevos o existentes y se emite la ACTUALIZACIÓN o INSERT correcto)
El escenario que falla es: - Eliminar objetos secundarios - es decir, si no están en el IList, no se eliminan de la base de datos. No hay excepción ni nada, simplemente no se eliminan.
Según entiendo, esto se debe a que la magia que nHibernate realiza para crear una lista de elementos secundarios que requieren eliminación no funciona con instancias separadas.
No he podido encontrar un ejemplo simple de cómo debe ser este tipo de método de acción con nHibernate (es decir, utilizando un objeto de modelo-enlazador como instancia de nHibernate desconectada) - ejemplos basados en MS EF (por ejemplo, http://stephenwalther.com/blog/archive/2009/02/27/chapter-5-understanding-models.aspx) parece utilizar un método 'ApplyPropertyChanges' para copiar las propiedades modificadas del objeto vinculado al modelo a una instancia de entidad recargadura.
Entonces, después de todo eso, la pregunta es bastante simple: si tengo la carpeta modelo, dame un objeto nuevo que contenga colecciones de objetos secundarios, ¿cómo debo actualizar eso a través de nHibernate, (donde 'actualización' incluye posiblemente eliminación de niños)?
Muchas gracias por esto, ¡mucho trabajo allí! Desafortunadamente, el bit con el que estoy luchando es que el objeto 'Persona' que tengo en la segunda sesión/transacción (es decir, mi POST) es un objeto completamente nuevo creado por ModelBinder, en lugar de un objeto recuperado que ha tenido un Se modificaron algunos campos y se realizaron algunas llamadas de 'eliminar secundarios'. Creo que lo que estoy buscando es una forma de tomar ese nuevo objeto y aplicar sus cambios al objeto recuperado, para que nh pueda resolver el SQL requerido. Quizás eso simplemente no existe. –
La manera en que trato de manejar esa situación es tratando el nuevo objeto creado por el archivador de modelo como un objeto del modelo de presentación. Deberá recuperar el objeto (o crear de alguna manera una instancia de la clase "persistente") que desee actualizar y aplicar esas actualizaciones a ese objeto. A continuación, puede guardar ese objeto en NHibernate. ¿Tiene sentido? –
Entonces, 'manualmente' (es decir, propiedad por propiedad, con bucles o lo que sea para las colecciones secundarias), sobrescribe las propiedades del objeto 'recuperado' con las propiedades del objeto 'presentación (es decir, POST)'? ¿Y calcula manualmente las eliminaciones secundarias requeridas? Parece un poco más de trabajo (y mantenimiento) de lo que esperaba. Apenas parece que valga la pena preocuparse por la carpeta de modelos, realmente, como si tuviera que manejar los campos uno a la vez, podría sacarlos directamente de la respuesta del formulario. Gracias por la ayuda, sin embargo. –