Cuando trabajando con Self-Tracking es recomendable separar las entidades del modelo para poder incluir estas en el cliente del servicio WCF.
Uno de los métodos para conseguirlo, es el de separar las entidades y mover la plantilla T4 que las genera en una librería de clases separada. Si movemos la plantilla, tenemos que modificarla para que la variable inputFile contenga la ruta relativa al fichero edmx.
Otra de las opciones para separar las entidades es la de mantener la plantilla T4 en el proyecto original, deshabilitar la generación de código y crear un enlace en el otro proyecto para que se genere el código de la plantilla en este proyecto por separado del modelo. Veamos este método con un ejemplo.
Partamos de un proyecto como el siguiente:
Lo que queremos es generar las entidades Self-Tracking y separarlas en un nuevo proyecto llamado Entities. Primero generamos las plantillas Self-Tracking, para esto con el botón derecho en el modelo y seleccionamos Add Code Generation Item, y elegimos la plantilla ADO.NET Self-Tracking Entity Generator.
Este proceso nos genera dos plantillas, una con el Context y la otra con las Entidades.
Deshabilitamos la generación de código para cada una de las plantillas que tenemos. Para esto, nos vamos a las propiedades del fichero tt, eliminamos el Custom Tool que tiene TextTemplatingFileGenerator y eliminamos los ficheros que se hayan generado.
Con esto le especificamos al proyecto que no genere el código de las plantillas.
Ahora tenemos que enlazar la plantilla de las entidades con el proyecto Entities. Lo hacemos añadiendo un elemento existente al proyecto, seleccionamos la plantilla Model.tt del proyecto Model y seleccionamos añadir con enlace. No nos olvidemos de añadir una referencia a System.Runtime.Serialization en el proyecto Entities, porque las entidades utilizan los atributos DataContract y DataMember que son usados para serializar con WCF.
Ahora enlazaremos el Context al servicio WCF. Seguimos el mismo paso que con las entidades, pero añadiendo como enlace la plantilla Model.Context.
Una vez añadido, le tenemos que especificar que genera las clases con el mismo espacio de nombres que las entidades, para esto vamos a las propiedades de la plantilla Context y en Custom Tool Namespace le ponemos Entities (que es el namespace del proyecto de las entidades).
La opción correcta pasa por modificar la plantilla del Context y añadirle en el WriteHeader el using del proyecto de Entities.
No nos olvidemos de añadir las referencias al proyecto de Entities y la del sistema System.Data.Entity
Con estos pasos nuestra solución quedaría como la siguiente imagen:
Un proyecto con las entidades Self-Tracking, un proyecto con el modelo y un proyecto con el servicio WCF y el contexto de Entity Framework.
Con esta separación en proyectos, nos permitiría crearnos un cliente, por ejemplo WPF, de nuestro servicio WCF y utilizar las clases que del proyecto Entities en este cliente para hacer uso del seguimiento de los cambios que se han implementado con Self-Tracking.
Saludos a todos…