sábado, 15 de octubre de 2011

Entity Framework: Separación de entidades POCO en ensamblados independientes

Hay ocasiones que podemos necesitar separar en ensamblados distintos las entidades de lo que es el acceso a datos y de esta manera referenciar en el proyecto cliente solamente el ensamblado con las entidades. Para ello una vez creado el diagrama de entidades de Entity Framework, pulsaremos con el botón derecho del ratón sobre el diagama y seleccionaremos el menú Add Code Generation Item y nos aparecerá la ventana Add New Item y seleccionaremos la plantilla ADO.Net POCO Entity Generator. Si no la tuviéramos instalada se puede descargar desde http://visualstudiogallery.msdn.microsoft.com/23df0450-5677-4926-96cc-173d02752313.
Una vez generados, si no hemos cambiado su nombre por defecto, nos aparecen dos archivos con plantillas T4 llamados Model1.tt y Model1.Context.tt. Lo primero que haremos será eliminar todos los archivos que cuelgan de Model1.tt los cuales corresponden a las entidades y en la propiedad Custom Tool eliminaremos el valor que haya y lo dejaremos en blanco.

Ahora procederemos a crear el proyecto para el nuevo ensamblado al cual llamaremos Entidades, para evitar problemas le cambiaremos el espacio de nombres y le pondremos el mismo que el del proyecto original . Una vez creado el proyecto añadiremos un nuevo ítem, seleccionaremos el archivo Model1.tt del otro proyecto y lo añadiremos como un link:

Ya sólo nos restaría crear el proyecto cliente en el que se va a utilizar las entidades y referenciar el ensamblado en cuestión.
En alguna ocasión al intentar usarlo desde otro proyecto me ha aparecido el siguiente error:

'ID' is not a member of type 'PruebaEF.Club' in the currently loaded schemas. Near simple identifier, line 1, column 80.
Para resolver este error habría que añadir la siguiente línea al proyecto PruebaEF.Context:
GTContext.MetadataWorkspace.LoadFromAssembly(typeof(Club).Assembly);
o           
GTContext.MetadataWorkspace.LoadFromAssembly(System.Reflection.Assembly.LoadFrom("PruebaEF.Entities.dll"));

Otra posible opción sería modificar el archivo Model1.Context.tt y a continuación de la línea:
this.ContextOptions.LazyLoadingEnabled = <#=isLazyLoading.ToString().ToLowerInvariant()#>;

añadir la línea:
MetadataWorkspace.LoadFromAssembly(System.Reflection.Assembly.LoadFrom("PruebaEF.Entities.dll"));

No hay comentarios:

Publicar un comentario