Copier-Coller un modèle de données d’un projet à un autre peut s’avérer complexe. En effet, des fichiers sont générés automatiquement et on peut vite se retrouver face à des problèmes du type « les classes POCO ne sont plus mises à jour », « perte de l’arborescence lorsque l’on fait un « Add Existing Item » de tous les fichiers dans le nouveau projet », …

Dans mon exemple, nous allons définir un modèle de données de type « Code First » que nous allons déplacer dans un autre projet.

Introduction : Entity Framework

Entity Framework permet de définir un modèle de données composé d’entités et de relations qui répond à vos problématiques business et s’affranchi ainsi de la définition pure et dure de la structure de la base de données. Pour se faire, le framework propose un « Entity Designer » qui permet de concevoir son modèle de manière intuitive. Il gère plusieurs fichiers xml qui contiennent toutes les informations nécessaires.

Le fichier MyDataModel.edmx est constitué des éléments suivants :

ef_composition

La section « EF Runtime content » contient les informations requises pour générer les fichiers .csdl, .ssdl et .msl requis par Entity Framework au moment de l’exécution :

  • CSDL (Conceptual Schema Definition Language): Définit les entités, les associations et les types complexes.
  • SSDL (Store Schema Definition Language) : Définit le schéma de la base de données
  • Mapping Specification Language : Définit les correspondances entre le modèle conceptuel et le modèle de la base de données.

Le fichier MyDataModel.edmx.diagram contient quant à lui les éléments d’affichage du diagramme avec la position x,y des objets.

 

Mise en situation

Nous souhaitons migrer un modèle de donnée d’un projet de test (MyCompany.ProofOfConcept) dans un projet existant (MyCompany.DataAccess).

Nous avons donc une solution « MyCompany » composée de 2 projets tel que :

 ef_init

1. Création et définition d’un modèle de données

Dans le projet « ProofOfConcept nous ajoutons un nouvel item de type « ADO.NET Entity Data Model »

 ef_newitem

Dans notre exemple nous créons un modèle de type « Code First »

ef_codefirst

Les références aux namespaces « System.Runtime.Serialization » et « System.Security » sont ajoutés et le fichier MyDataModel.edmx a été créé.

Nous définissons ensuite le modèle :

 ef_model

Note : Les classes POCO ne sont pas créées tant qu’une connexion à la base de données n’est pas définie.

Nous générons le script de création de la base de données en faisant clic droit sur le designer puis « Generate Database from Model… »

ef_generate

Entity framework a créé un nouveau fichier « MyDataModel.edmx.sql » ainsi que 2 autres fichiers sous l’arborescence de notre MyDataModel.edmx à savoir « MyDataModel.Context.tt » et « MyDataModel.tt ». Les fichiers .tt (T4 text template) sont des modèles de fichiers dans lesquels des règles de génération peuvent être ajoutés.

Sous MyDataModel.tt, on constate que chaque entité définie dans le modèle a une classe POCO correspondante.

Comparons les fichiers visibles dans le « Solution Explorer » et Visual Studio et les fichiers présents dans le File Explorer :

ef_compare

On constate que les classes POCO ont été créées.

 

2. Déplacer le modèle

Pour déplacer le modèle de « MyCompany.ProofOfConcept » vers le projet « MyCompany.DataAccess», on pourrait être tenté de copier tous les fichiers qui ont été créés par entity framework et de faire un « Add > Existing item… ». Cependant Visual Studio ne parvient pas à reconstruire la même arborescence et on obtient le résultat suivant :

ef_fail

Bien que le fichier edmx soit toujours disponible avec le designer, les classes POCO ne seront plus générées.

3. Solution

Nous copions les 3 fichiers suivants :

  • MyDataModel.edmx
  • MyDataModel.Designer.cs
  • MyDataModel.edmx.diagram

Puis, dans Visual Studio, nous ajoutons uniquement le fichier MyDataModel.edmx:

ef_addfile

Nous générons ensuite le script de création de base données en faisant « Generate Database from Model… » depuis le designer. La connectionstring sera ajoutée dans le fichier app.config comme dans notre premier projet.

Nous obtenons donc notre copie comme dans le premier projet.

ef_succeed

Toutefois il peut arriver que VisualStudio ne parvienne pas à recréer les classes POCO malgré l’ajout de la connexion.

Nous avons dans ce cas:

ef_nopoco

Dans ce cas de figure, retournez sur le designer et faites clic droit > « Add Code Generation Item… ».

ef_addgenerationitem

ef_dbcontextgenerator

Et vous retrouverez alors votre modèle comme dans notre projet « ProofOfConcept ».

 

Last modified: 11 September 2014

Author

Comments

Write a Reply or Comment

Your email address will not be published.