Ce tutoriel à pour objectif de fournir une démarche pas à pas pour la création d’une application CRUD avec WebMatrix, Razor et Entity Framework.
– Part 1 : introduction et présentation des outils
– Part 2 : création de l’application et définition du modèle objet
Dans les parties précédentes, nous nous sommes familiarisés avec les outils que nous allons utiliser, et nous avons par la suite procédé à la création de l’application et à la définition du modèle objet qui sera utilisé.
Cette partie portera sur la création du DbContext, la définition de la chaine de connexion dans le fichier Web.Config, la création de la base de données à partir du modèle objet et afin la définition du Repository qui sera utilisé.
Création du DBContex
Nous allons maintenant créer la classe qui va s’occuper de gérer la communication entre les classes entités et la base de données. Cette classe va hériter de la classe DbContext.
La classe DbContext expose les fonctionnalités les plus couramment utilisées pour interroger et puis utiliser les données d’entité en tant qu’objet.
Vous allez ajouter au dossier App_Code un nouveau fichier de classe ayant pour nom « WebMatrixCrudApp.Context.cs ».
Dans ce fichier, vous allez ajouter une nouvelle classe « WebMatrixCrudAppContext » qui hérite de DbContext.
Cette classe doit contenir trois attributs DbSet fortement typés correspondants à vos différentes entités. Les attributs DbSet vont permettre de gérer la correspondance avec les tables de la base de données.
Dans ce fichier, vous aurez le code suivant :
using System;
using System.Data.Entity;
/// <summary>
/// Summary description for ClassName
/// </summary>
public class WebMatrixCrudAppContext : DbContext
{
public DbSet<Personne> Personnes { get; set; }
public DbSet<Organisme> Organismes {get; set; }
public DbSet<Affiliation> Affiliations {get; set; }
}
La prochaine étape sera l’ajout de la chaine de connexion pour le mode Code First d’Entity Framework dans le fichier Web.config.
Pour cela, doublez cliquez sur le fichier Web.config dans l’explorateur de solution et ajoutez les lignes de code suivantes à celui-ci :
connectionStrings>
<add name="WebMatrixCrudAppContext" connectionString="Data Source=|DataDirectory|WebMatrixCrudApp.sdf"
providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
Le nom de la chaîne de connexion doit être celui de votre classe DbContext (WebMatrixCrudAppContext)
Le fichier XML de configuration de votre application doit ressembler à ceci :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation>
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<add assembly="System.ComponentModel.DataAnnotations, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /></assemblies>
</compilation>
</system.web>
<connectionStrings>
<add name="WebMatrixCrudAppContext" connectionString="Data Source=|DataDirectory|WebMatrixCrudApp.sdf"
providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
</configuration>
Procédez à l’exécution de votre application en cliquant sur le bouton « Run » et sélectionnez le navigateur de votre choix dans la boite d’outils.
La base de données SQL Server Compact « WebMatrixCrudApp.sdf » sera automatiquement créée dans le dossier App_data de votre application.
En sélectionnant l’espace de données Databases, vous pouvez constater qu’une nouvelle base de données a été ajoutée à votre application.
En observant cette base de données, vous vous rendez compte que les tables qui ont été créées correspondent aux propriétés DbSet de la classe WebMatrixCrudAppContext.
On remarque également que la taille des colonnes Nom et Prenom par exemple de la table Personnes est la même que celle que vous avez défini dans la classe Personne avec l’attribut [MaxLengthAttribute(50)]
En sélectionnant la table Affiliations et en cliquant sur la commande View de la zone Relationships, vous constatez également que les relations de clés étrangères qui ont été définies pour la classe Affiliation ont été créées.
En cliquant par exemple sur la relation Affiliation_Organisme, vous obtenez le résultat suivant :
Une table supplémentaire EdmMataData a été ajoutée dans votre base de données. Cette table permet à Entity Framework Code First de savoir si le modèle utilisé pour créer une base de données est le même que celui qui est utilisé pour accéder à cette base de données (avec la version 4.3 d’EF cette table n’est plus créée).
Dans le cas au vous apportez des modifications à votre modèle objet, lors de l’exécution de l’application une exception sera levée.
Pour corriger cela, vous allez ajouter les lignes de code suivantes dans le fichier _AppStart qui se trouve à la racine de votre application :
@using DB = System.Data.Entity;
@{
DB.Database.SetInitializer(new DB.DropCreateDatabaseIfModelChanges<WebMatrixCrudAppContext>());
}
En cas de modification du modèle objet lors de l’exécution de l’application, ces lignes de code vont permettre de régénérer la base de données qui correspondra au nouveau modèle.
Attention, la base de données sera recréée à nouveau, donc toutes les données présentes dans celle-ci seront perdues.
Création d’un Repository
Les bonnes pratiques de développement avec Entity Framework recommandent l’utilisation d’un Repository pour les opérations CRUD. Le Repository permet de créer une couche d’abstraction entre la couche d’accès aux données et la logique métier de l’application, et éviter ainsi une dépendance entre la base de données et la logique métier.
Le code du Repository permettant d’effectuer des opérations CRUD sur l’entité Personne est le suivant :
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Web;
/// <summary>
/// Summary description for ClassName
/// </summary>
public class PersonneRepository
{
private WebMatrixCrudAppContext _context = new WebMatrixCrudAppContext();
public Personne Find(int id)
{
return _context.Personnes.Find(id);
}
public List<Personne> GetAll()
{
return _context.Personnes.ToList();
}
public void Add(Personne personne)
{
_context.Personnes.Add(personne);
_context.SaveChanges();
}
public void Delette(Personne personne)
{
_context.Personnes.Remove(personne);
_context.SaveChanges();
}
public void Update(Personne personne)
{
_context.Entry(personne).State = EntityState.Modified;
_context.SaveChanges();
}
public void Remove(Personne personne)
{
_context.Personnes.Remove(personne);
_context.SaveChanges();
}
}
Ce code doit être ajouté dans un fichier PersonneRepository.cs dans le dossier App_Code. Créez de même les Repository pour les entités Organisme et Affiliation respectivement dans les fichiers OrganismeRepository.cs et AffiliationRepository.cs.
La fonction Find() pour AffiliationRepository doit prendre deux valeurs en paramètre. Le code doit ressembler à ceci :
public Affiliation Find(int personneId, int organismeId)
{
return _context.Affiliations.Find(personneId, organismeId);
}
La partie suivante portera sur l’implémentation des fonctionnalités CRUD pour nos différentes tables.