2010-07-14 26 views
5

Con NHibernate ya no exponer las claves externas en mis objetos de dominio, por lo que producto ya no tiene una propiedad:ASP.NET MVC NHibernate modelo de unión

public int CategoryId {get;set;} 

sino que tiene:

public Category Category {get;set;} 

Unforunately esto no parece funcionar tan bien con el enlace de modelo automático en ASP.NET MVC - si quiero simplemente vincular una colección de formularios directamente a mi objeto de dominio.

Por ejemplo, no podía simplemente tener una lista de selección de valores de Id de categoría en mi vista, aceptar un objeto de producto en mi acción de controlador y esperar que MVC convirtiera esto en un objeto de categoría.

Mi solución hasta ahora ha sido crear modelos de vista que do tienen propiedades para los valores de clave foránea - Sin embargo, esto normalmente conduce a un poco de duplicación en el código y la lógica de asignación adicional en mi controlador.

¿Hay una manera mejor?

Respuesta

7

El enfoque recomendado es utilizar modelos de vista reducida diseñados específicamente para sus vistas; puede simplificar las operaciones de mapeo requeridas usando AutoMapper.

+1

Sé que este es el enfoque recomendado, pero a veces simplemente no es necesario. Tengo un objeto de dominio simple con tres propiedades, simplemente parece mucho trabajo extra para algo tan simple. –

+1

@Ben - Últimas palabras famosas ... En serio, AutoMapper hace que esto sea trivial, una vez que empiezas a encontrar cualquier tipo de desconexión entre tu modelo de dominio y tus modelos de vista, te agradecerás por seguir esta ruta ... – DanP

+0

Y ahí estoy querer algo rápido y sucio :) - AutoMapper parece ser la mejor opción y, en base a otras soluciones sugeridas, los modelos de vista específicos parecen ser el enfoque más limpio, incluso en objetos simples. –

4

Además, recuerde que cuando utiliza Nhibernate, se trata de objetos proxy y lo mejor es no intentar serializarlos a través de los límites de la aplicación, como el enlace de modelo, servicios web o llamadas remotas.

Si necesita convertir CustomerID en Cliente, tendrá que crear un Encuadernador de modelo personalizado que tenga en cuenta el repositorio de datos y pueda tomar el ID de cliente y obtener un objeto de Cliente. Hay algunos casos en que esto es útil, pero no lo recomendaría para este escenario.

+0

de acuerdo; en realidad tenemos 2 capas de dtos; uno devuelto por la capa de servicio y otro utilizado específicamente para las vistas. Los de la capa de servicio aseguran que los datos necesarios estén completamente hidratados antes de cruzar el límite del servicio. – DanP

Cuestiones relacionadas