44 votos

Generar las clases POCO en diferentes proyectos para el proyecto con el modelo de Entity Framework

Estoy tratando de utilizar el modelo de Repositorio con EF4 el uso de VS2010.

Para ello estoy usando POCO la generación de código haciendo clic derecho sobre la entidad diseñador de modelos y haga clic en Agregar elemento de generación de código. Yo, a continuación, seleccione el POCO plantilla y conseguir mis clases.

Lo que me gustaría ser capaz de hacer es tener mi solución estructurada en distintos proyectos para la Entidad (POCO) clases y otro proyecto para el modelo de entidad y el repositorio de código.

Esto significa que mi proyecto de MVC podría utilizar las clases POCO para el establecimiento inflexible de tipos de vistas, etc y no tienes que saber sobre el repositorio o tiene que tener una referencia a él.

Para conectar todo junto, voy a tener otro proyecto independiente con interfaces y el uso de la Coi.

Suena bien en mi cabeza yo no sé cómo generar las clases en su propio proyecto! Puedo copiar y, a continuación, cambiar los espacios de nombres en ellos, pero yo quería evitar el trabajo manual siempre que puedo cambiar el esquema en la base de datos y desea actualizar mi modelo.

Gracias

39voto

Alex James Puntos 15939

En realidad las plantillas T4 en EF 4.0 fueron diseñados con este escenario en mente :)

Hay 2 modelos:

  • Una de las Entidades en sí mismas (es decir, nombre del modelo.tt)
  • Uno de ObjectContext (es decir, nombre del modelo.Contexto.tt)

Usted debe poner el nombre del modelo.tt archivo en usted POCO del proyecto, y acaba de cambiar la plantilla para que apunte al archivo EDMX en la persistencia de la cuenta del proyecto.

Suena raro, lo sé: ahora Hay una dependencia, pero es en el T4 tiempo de generación, no en tiempo de compilación! Y eso debería ser bueno? Debido a que la resultante de POCO asamblea está todavía completamente persistencia de ignorantes.

Consulte los pasos 5 y 6 de este: http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx para obtener más.

Espero que esto ayude

Alex

5voto

hjoelr Puntos 330

@Nick,

  1. Para forzar la regeneración de las entidades POCO, solo necesitas dar clic derecho en la principal .tt archivo y seleccione "Ejecutar la Herramienta Personalizada". Esto obligará a regenerar sus clases POCO con sus cambios se actualizan al .modelo de edmx.
  2. Hay algún problema con que vaya adelante y Haga clic en el modelo y seleccionando la opción "Generar Base de datos de Modelo..." aunque no necesariamente la generación de la base de datos? Que lo más probable es deshacerse de su " Error 11007...'.
  3. Creo que es el equivalente a un "Código de Detrás". No sé nada más que eso.

Una cosa a tener en cuenta sobre el vínculo que Alex le dio. Una vez que me mudé mi principal .tt archivo a un proyecto diferente, el archivo que se generó a partir de la ".Contexto.tt" archivo no compila porque no se que faltan referencias a POCO los archivos que se encuentran en otro espacio de nombres (porque yo quería que mi ObjectContext estar en un dominio distinto al de mi POCO los archivos). He tenido que modificar el ".Contexto.tt" archivo tenía una using Poco.Namespace (donde Poco.Namespace es el nombre del espacio de nombres donde el POCO archivos generados). Entonces, esto permitió que mi proyecto para compilar.

Joel

4voto

J.G. Hek Puntos 21

Para EF5 + DbContext generador: Es fácil de mover su Nombre.Contexto.tt a un proyecto diferente. Sin embargo, será necesario hacer referencia a las clases del modelo. Usted puede hacer esto de forma manual, pero esto va a requerir que la cambie cada vez que el código se genera. También se podría utilizar el mismo espacio de nombres para ambos proyectos. Esto es válido y el trabajo, pero creo que este es un mal diseño. Otra alternativa es cambiar la plantilla T4 (Nombre.Contexto.tt).

Cambiar este (línea 43):

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (container.FunctionImports.Any())
{
#>

A este:

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (modelNamespace != codeNamespace)
#>
using <#=code.EscapeNamespace(modelNamespace)#>;
<#
if (container.FunctionImports.Any())
{
#>

Se comprueba si el modelo de espacio de nombres difiere de su código de espacio de nombres, si es así, será insertar el requerido, utilizando para hacer referencia a las clases del modelo.

1voto

Josh Simerman Puntos 385

Me he encontrado con un grave error cuando se utiliza este enfoque, combinado con la Dinámica de los proyectos de Datos y controles. Básicamente, usted obtendrá un error.

"No se pudo determinar un MetaTable. Un MetaTable no se pudo determinar el origen de datos 'EntityDataSource1' y uno no puede ser inferida a partir de la URL de la petición. Asegúrese de que la tabla se asigna a la dat de origen, o que el origen de datos está configurado con una validez de tipo de contexto y el nombre de la tabla, o que la solicitud es parte de un registro de DynamicDataRoute."

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X