none
Asp.Net MVC 4 EF6 Areas RRS feed

  • Pregunta

  • Saludos a Todos

    Tengo definida mi Arquitectura para un proyecto utilizando las capas Presentacion-Servicio-Negocio-Datos (n-Tier)

    En la capa Datos utilizo Entity Framework 6 con Model First, y aquí tengo el modelo por ejemplo de Personas, Configuracion, Reclamos, Produccion... como saben aquí me genera mi Contexto, las plantillas T4 donde están las distintas clases tanto para Personas, Configuracion ....

    Mi duda es la siguiente ya que en la capa de presentación tengo definido ASP.Net MVC4 y tengo mis areas definidas como se puede ver en la figura:

    Areas de la capa de presentacion

    En cada area me crea una estructura Model, View, Controllers .. como hago para que en Model de un area predeterminada este el modelo que esta en mi capa de datos? me parece que estaría redundando aquí al tener el mismo modelo tanto en la capa de datos y lo mismo en presentación dentro de Asp.Net MVC

    Como puedo mejorar esta arquitectura propuesta? alguien se topo con el mismo problema y como lo soluciono les estare agradecido me den luces para resolver esto.

    Ricardo

    miércoles, 9 de abril de 2014 21:45

Respuestas

  • hola

    recuerda que el modelo de dominio no necesariamente tiene que ser igual al que muestres al usuario en la view

    podrias tener una entidad con digamos 10 propiedades y al usuario en una view solo le muestras 4 por eso el model tendra esas 4 propiedades y no las 10 que define tu modelo en EF

    para convertir una en otra podrias usar automapper si tienes alguna capa de servicio o aplicacion alli harias la conversion de uno a otro

    ademas recuerda que en las clases de modelo podrias definir atributos de DataAnnotation lo cual no puedes poner en als entidades de EF define, esta es otra razon mas por la cual separar el modelo de EF de lsa clases de model de la view

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta ricardo_jal jueves, 10 de abril de 2014 18:52
    jueves, 10 de abril de 2014 12:58

Todas las respuestas

  • En una aplicación MVC los Modelos no tienen por qué estar dentro de la carpeta Model, tanto si usas areas como si no. Puedes usar cualquier clase visible en la aplicación como modelo, incluso una clase autogenerada dentro de una DLL que se encuentra referenciada desde el proyecto MVC.

    Fíjate en que típicamente tu aplicación manejará DOS tipos de modelos:

    Por una parte tienes (1) el Modelo de datos, formado por las clases de Entity Framework, que transporta datos desde la base de datos al Controlador (y si tienes entre medias capas de negocio y servicios, a veces dependiendo de la arquitectura de la aplicación se sustituye ese Modelo por otros Modelos adicionales para el transporte de datos entre capas).

    Y por otra parte, tienes (2) el Modelo de MVC que se usa para transportar datos entre el Controlador y la Vista.

    En aplicaciones sencillas, a veces el modelo 1 y el 2 son el mismo (cuando los datos que presentamos en la Vista resultan coincidir exactamente con los que traemos de la base de datos). En estos casos sencillos, se puede usar el mismo modelo de EF como modelo de MVC. Pero en el caso más general, en aplicaciones sofisticadas donde el Controlador extrae datos de la BD, hace cálculos con ellos, y presenta resultados en la Vista, los dos Modelos serán distintos. Para distinguirlos, a veces el modelo de MVC se llama "VistaModelo", para distinguirlo del modelo de EF, que se llama simplemente "Modelo".

    El VistaModelo, si se usa, es el que típicamente escribiremos dentro de la carpeta Models del area correspondiente (y como es específico para una Vista concreta de ese Area, no tiene mucho sentido escribirlo en otro sitio).

    El Modelo de EF típicamente pertenece a la capa de datos, y se añade usualmente en el proyecto de la capa de datos, o en el proyecto de la capa de comunicación en el caso de que se haya decidido usar esos mismos objetos para la comunicación entre capas. Aunque esté en este proyecto separado, si el proyecto de MVC tiene una referencia al mismo, te lo permite usar como Modelo de MVC en cualquiera de las Areas, en el caso de que existiera en ese Area una vista trivial que no requiera su propio VistaModelo.

    jueves, 10 de abril de 2014 2:06
  • Gracias Alberto Poblacion

    Para aclararme mas la idea no tuviera un ejemplo o no sabra de algun articulo o tutorial para revisar le agradeceria.


    RICARDO ARANIBAR

    jueves, 10 de abril de 2014 5:16
  • hola

    recuerda que el modelo de dominio no necesariamente tiene que ser igual al que muestres al usuario en la view

    podrias tener una entidad con digamos 10 propiedades y al usuario en una view solo le muestras 4 por eso el model tendra esas 4 propiedades y no las 10 que define tu modelo en EF

    para convertir una en otra podrias usar automapper si tienes alguna capa de servicio o aplicacion alli harias la conversion de uno a otro

    ademas recuerda que en las clases de modelo podrias definir atributos de DataAnnotation lo cual no puedes poner en als entidades de EF define, esta es otra razon mas por la cual separar el modelo de EF de lsa clases de model de la view

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marcado como respuesta ricardo_jal jueves, 10 de abril de 2014 18:52
    jueves, 10 de abril de 2014 12:58
  • gracias Leandro

    Me ayudo bastante  lo que me indicas.

    1. No necesariamente las propiedades definidas en la entidad las tendré en el modelo de MVC

    2. Me ubique muy bien en lo que indicas que puedo definir atributos de DataAnnotation en el modelo de mvc pero no en EF.

    3.- No entendí la conversión de las entidades al modelo o viceversa con automapper.

    Si alguien mas podria colaborar dando razones por que separamos el modelo de EF con las clases del model en MVC les estare a gradecido


    RICARDO ARANIBAR

    jueves, 10 de abril de 2014 13:10
  • No entendí la conversión de las entidades al modelo o viceversa con automapper.

    a la capa de presentacion que entidades de datos envias? seguramente estas usando las mismas que defines en EF  yeso no es correcto

    por eso con automapper podrias convertir las entidades de EF en entidades de presentacion

    en realidad la capa de servicio no deveria devolver como respuesta entidades de negocio, para que quede claro como harias si entre la presnetaicon y el negocio tendrias WCF para desacoplarlo de forma remota, bueno eso mismo (aunque quizas sin WCF) es como deberias plantearlo y es alli donde autmapper te hace la vida mas simple convirtiendo una entidad en otra con un simple mapping

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 10 de abril de 2014 14:10
  • recuerda que en las clases de modelo podrias definir atributos de DataAnnotation lo cual no puedes poner en als entidades de EF define

    No estoy de acuerdo. Sí que se pueden poner DataAnnotations en las entidades de EF. La forma de hacerlo es aplicar los atributos sobre una clase auxiliar y luego esa clase auxiliar conectarla con la autogenerada por EF mediante un atributo [MetadataType(...)] aplicado a la clase de EF a través de partial class. Así dicho parece complicado, pero una vez organizado el código resulta relativamente simple.

    jueves, 10 de abril de 2014 15:19
  • Alberto, entonces quieres decir que recomiendas usar la entidad de negocio como model de la view?

    y si la view requiere alguna propiedad para realizar algun calculo que el usuario necesita ver (pero que no se persisite), o si se debe poner alguna propiedad referente a la seguridad que indique si el usuario ve una opcion en la view o no

    todo esos cambios los realizas sobre al entidad de negocio ?

    los ejemplos que se encuentran en internet en donde usan linq directo en el controlador y el modelo de EF (de negocio) lo usan en la view esta buenoa para practicar o para realizar algun prototipo, pero para desarrollar algo real no lo recomiendo

    ensuciar el modelo de negocio para mi no es buena idea, pero bueno cada uno evalua y define la arquitectura que mas le conviene

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 10 de abril de 2014 18:01
  • Alberto, entonces quieres decir que recomiendas usar la entidad de negocio como model de la view?

    Usualmente, no. Sólo lo recomiendo en el caso de aplicaciones muy muy simples en las que el contenido que vamos a mostrar en la vista coincide con el contenido que hemos traído de base de datos. Un ejemplo sería un simple proceso de Altas, Bajas y Modificaciones generado automáticamente mediante Scaffolding.

    Por lo demás concuerdo contigo: en el caso más general, en el que usualmente vamos a mostrar en la vista ciertos resultados que provienen del procesamiento en el controlador, soy partidario de construir un modelo específico para pasar esos datos a la vista (hay gente que a esto lo llama "vistamodelo" en lugar de "modelo", para diferenciarlo).

    jueves, 10 de abril de 2014 18:22
  • Sólo lo recomiendo en el caso de aplicaciones muy muy simples en las que el contenido que vamos a mostrar en la vista coincide con el contenido que hemos traído de base de datos.

    ahh bien ahora si, totalmente de acuerdo

    soy partidario de construir un modelo específico para pasar esos datos a la vista (hay gente que a esto lo llama "vistamodelo" en lugar de "modelo", para diferenciarlo).

    exacto asi es como tambien lo trabajo


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 10 de abril de 2014 18:29
  • Leandro y Alberto 

    gracias por sus puntos de vista y el buen debate que realizo.


    RICARDO ARANIBAR

    jueves, 10 de abril de 2014 18:52