Entity Framework Self-Tracking, paso a paso

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.

SelfTracking_0

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:

SelfTracking_1

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.

SelfTracking_2

Este proceso nos genera dos plantillas, una con el Context y la otra con las Entidades.

SelfTracking_3

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.

SelfTracking_4

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.

SelfTracking_5

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.

SelfTracking_8

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:

SelfTracking_7

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…

9 comentarios sobre “Entity Framework Self-Tracking, paso a paso”

  1. Perdoname Alberto, pero no estoy nada de acuerdo con un paso que sigues en este sencillo walkthrough, ¿Para que obligas a la plantilla del contexto de trabajo a generarse en el mismo namespace de las entidades? Esto no tiene sentido, además de ser una mala práctica. Para eso tienes dentro de tu t4 una función WriteHeader que te permite indicar el namespace de las entidades, y de otras cosas que puedes llegar a necesitar.
    Date cuenta de que por regla general las entidades de hecho pertenecen a otra capa distinta a la que situas el contexto de trabajo y por lo tanto compartir el namespace es una pequeña «burrada»..
    Espero que entiendas mi comentario…
    Saludos
    Unai

  2. mmm … y ya que hay 2 cracks en el tema, q aconsejan para escenarios donde la db no sea SQL y tenga que pasar STE entre cliente/servidor por servicios WCF por ejemplo?

    Salu2

  3. Que aconsejamos respecto a que Bruno, es que me suena muy ambigua la pregunta… Cual es el problema de que no sea SQL, STE no sabe nada acerca del provider. La única consideración que tienes que tener es que el código de gestión de las STE debería de estar en cliente .. es decir es una implicación .NET a .NET por eso se suelen reaprovechar los ensamblados de las entidades en el proxy wcf del cliente. Si no es esta tu pregunta y la concretas mucho mejor 🙂 por cierto, ya que tenías miedo sobre el tema prueba dotConnectForOracle con EF y verás lo bien que funciona titan

  4. Como bien dice Unai, el STE (Self-Tracking Entities) es para aplicaciones .NET a .NET.

    La mejor opción sería buscar o desarrollar un proveedor de EF para la base de datos que necesites.

  5. ambos son unos cracks … ya con esto y lo que estoy leyendo me voy armando una idea de lo que puedo y de lo que no debo hacer .. 😀 (by the way, ahora q las veo a fondo, como molan las STE !!!)

    Salu2 y thanks

  6. Muchas gracias por la aclaración.
    Estoy preparando una demo y la verdad es que con estas «puntillitas» todo se ve más fácil

    Saludos y buen fin de semana
    Juanlu

  7. Muchas gracias por el Post, me quebré la cabeza separando los tt en varias capas, con el método de cambiar el PATH del EDMX en el .tt que genera las entidades, no se porque no me reconocia el PATH relativo de mi EDMX, a pesar que estava seguro que esa ruta estaba buena (solo me funcionaba con el FULL PATH), pero al final encontré este metodo (de importar item existente como un link) en una página en ingles y lo solucione al vuelo… a propósito, allí también comenten la pequeña «burrada» como lo comenta Unai, ya mismo procedo a corregirlo.

    asi pasa casi siempre, despues que me mate mucho rato configurando el STE como se debe, vengo y encuentro este post que me ubiese ahorrado varias horas, pero bueno, todo es aprendizaje y luchando se aprende mas…

    excelente tu ayuda, mejor y mas facil de entender no creo que se encuentre

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *