Archive

Archive for November, 2010

Visual Studio Add-in para el Domain Service [Include()] attributo

November 10, 2010 Leave a comment

A veces uno no tiene el lujo a desarrollar applicaciones desde el modelo de objectos. Eso significa que es necessario a obtener el modelo desde la base de data. Gracias a Microsoft, tenemos el Entity Framework o Linq2Sql para ayudarnos. Ya que estamos creando una applicacion de Silverlight, todavia no hemos terminado. Tenemos que usar WCF RIA Services para el transporte de nuestros cambios en la applicacion.
Tengo un problema como WCF RIA Services no esfuerza a mantener el modelo. Lo que pasa es cualquier momento que la base de data cambia, tengo que modificar varios archivos:

  1. Actualizar el Entity Framework (. edmx) o Linq2Sql (. dbml) con el esquema datebase cambios.
  2. Borrar el DomainService que has creado, incluyendo el “Service” archivo y el “.metadata” archivo.
  3. Genere el proyecto Web que aloja el modelo.
  4. Añadir un nuevo DomainService.
  5. Agregue todos los [Include()] atributos en el “.metadata” archivo.

Ahora estas es una experiencia muy dolorosa y cada vez que puede automatizar este lo voy a hacer. Esto nos lleva al asunto de este puesto, que es una manera de automatizar por lo menos la adición del [Include()] atributo en el archivo de “.metadata”. Mi solución esta basada aquí. Hice unos modificaciones para que podemos usarlo con proyectos que tienen carpetas y para que funciona en Visual Studio 2010 RTM.

Para crear una Add-in en Visual Studio 2010, coloca nueva solución y extensibilidad en el marco del “Otros tipos de proyectos” y luego “Visual Studio Add-in”, como se muestra a continuación:

El “template” de proyecto crea lo que se muestra a continuación con la excepción del archivo MetadataHelper.cs.

Tómese su tiempo para revisar lo que contiene el Connect.cs archivo y ya que hay lógica personalizada para conseguir el MetadataHelper.cs archivo.

Básicamente, el objetivo de este complemento es para que pueda actualizar el .edmx o .dbml y borrar y volver a crear el DomainService. Una vez que usted ha terminado, haga clic en el menú “Tools” en Visual Studio y seleccione MetadataAddin.

El Addin va a hacer un ciclo a través de todos sus proyectos en sus soluciones y todas sus carpetas en sus proyectos. Básicamente, se busca todos los archivos “.metadata”. Una vez que se encuentra el archivo, se crea un diccionario de los tipos de objectos expuestas a través el MetadataTypeAttribute. A continuación, busca cualquier “EntityCollection” o cualquier objecto que contenido en el diccionario como propiedades y agrega el [Include()] atributo.

Por último, he añadido el código que nos avisa cuando se termina la operación.

Cuando el proceso ha terminado todos sus archivos “.metadata” se cargarán y se podrá revisar los cambios realizados en los archivos.

Aquí está el link para el proyecto de ejemplo. He incluido un archivo README.txt en el proyecto para indicarle dónde debe poner el “Add-in”.

Espero que esto ayude!

Advertisements

Visual Studio Add-in for Domain Service [Include()] attribute

November 10, 2010 5 comments

Sometimes you don’t have the luxury to develop your applications from a domain centric approach. This means that you need to do reverse engineering of your datamodel and create your entities from it. Luckily we have either the Entity Framework or Linq2Sql to help us out. Since we are targeting Silverlight, we are still not finished as we need to use WCF RIA Services to transport our changes back and forth from the server.

An issue I have with the current workflow when using WCF RIA Services is that anytime the database model changes, we need to do several things:

  1. Update the Entity Framework (.edmx) or Linq2Sql (.dbml) file with the datebase schema changes.
  2. Drop the DomainService that you have created which includes the service file and the .metadata file.
  3. Build the Web project that is hosting your model.
  4. Add a DomainService again.
  5. Add all of the [Include()] attributes into the .metadata file.

Right now this is a very painful experience and whenever I can automate this I will do so. This leads us to the purpose of this post which is a way to at least automate the adding of the [Include()] attribute on the .metadata file. The solution to this was originally posted here and I have modified it slightly to support recursive folders and to work on Visual Studio 2010 RTM.

I created a new solution and selected Extensibility under the “Other Project Types” and then “Visual Studio Add-in” as seen below:

The project template will the create what is shown below except for the MetadataHelper.cs file.

Take some time to review what is in place in the Connect.cs file as well since there is some custom logic to get my MetadataHelper.cs file working correctly.

Basically the purpose of this Add-in is to allow you to update your .edmx or .dbml file and the drop and re-create your DomainService. Once you have done that you will click on the Tools menu in Visual Studio and then select MetadataAddin.

This will cycle through all of your projects in your solutions and all of your folders in your projects. It basically is looking for any .metadata files. Once it finds the file it builds a dictionary of the types of entities exposed through the model by looking for the MetadataTypeAttribute. It then looks for any “EntityCollection” properties or any types that were stored in the dictionary as properties and adds the [Include()] attribute.

Finally, I added code to popup a message box letting me know that it has “Finished executing”.

When the process has finished all of your .metadata files will be loaded and you will be able to review the changes made to the files.

Here is the link to the sample project. I included a README.txt file in the project to show you where you need to put the Add-in once you have successfully built the project.

Hope this helps!