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.
Dans la première partie introductive, nous avons présenté le but de cet article et les différents outils qui seront utilisés pour l’implémentation de notre application CRUD.
Cette seconde partie portera essentiellement sur la création de l’application avec WebMatrix, l’installation d’Entity Framework à partir de NuGet et la définition du modèle objet.
Création de l’application
Maintenant que nous nous sommes familiarisés avec les différents outils que nous allons utiliser, nous pouvons maintenant procéder à la création de notre application.
Pour cela, vous allez lancer WebMatrix. Dans la fenêtre de démariage rapide, vous allez sélectionner Modèles (Templates) parmi les différentes options qui sont proposées.
Dans la fenêtre qui va s’afficher, sélectionnez le modèle de projet Site de démarrage (Starter Site), renseignez le nom du site (WebMatrixCRUDApp) et cliquez enfin pour le bouton OK.
Le modèle Site de démarrage contient par défaut une interface à onglet et des fonctionnalités d’authentification.
Une fois le projet créé, vous pouvez voir les éléments suivants dans la fenêtre d’exploration, en sélectionnant l’espace de travail Files dans la zone de sélection d’espace de travail.
Installation d’Entity Framework
Dans la boite d’outils, vous allez cliquer sur le bouton « Gallery » ayant le logo de NuGet. Dans la fenêtre des packages qui s’affichent par défaut, sélectionnez le package Entity Framework comme l’illustre l’image ci-dessous :
La fenêtre du gestionnaire de packages NuGet s’affiche avec les détails sur le package que vous souhaitez installer.
Cliquez sur le bouton « Install » et acceptez les termes d’utilisation pour que NuGet procède au téléchargement et à l’installation d’Entity Framework dans votre application :
Le fichier EntityFramework.dll sera alors ajouté dans le dossier bin de votre application et une référence à l’espace de nom System.Data.Entity sera automatiquement ajoutée au fichier Web.config.
Définition du modèle objet
Notre exemple simple portera sur une petite application pour la gestion du carnet d’adresses d’une entreprise. L’entreprise contient plusieurs organismes et un employé peut travailler dans un ou plusieurs organismes.
Le schéma de la base de données que nous allons utiliser est donc le suivant :
De ce schéma, nous allons créer les différentes entités correspondantes. Chaque entité doit être définie comme une classe C# afin d’être compréhensible par Entity Framework.
Vous allez créer un nouveau dossier « App_code » en faisant un clic droit sur votre projet dans l’explorateur de solution et en cliquant sur « New Folder ».
Sélectionnez ce dossier et ajoutez-y un nouveau fichier C# en cliquant sur le bouton « New » de la boite d’outils et ensuite sur la commande « New File ».
Dans la fenêtre qui va s’afficher, sélectionnez le type de fichier Class(C#), renseignez le nom du fichier (Personne.cs) et validez sur OK.
Ajoutez par la suite les lignes de code suivantes dans ce fichier pour définir la classe Personne.
public partial class Personne
{
public int PersonneId { get; set;}
public string Nom {get; set;}
public string Prenom {get; set;}
}
Procédez de même pour le fichier Organisme.cs, dont la classe aura la définition suivante :
public partial class Organisme
{
public int OrganismeId { get; set;}
public string Nom {get; set;}
public string Adresse {get; set;}
public string Telephone {get; set;}
}
Créez également la classe Affiliation qui aura la définition suivante :
public partial class Affiliation
{
public int PersonneId { get; set;}
public int OrganismeId { get; set;}
public string Fonction {get; set;}
public string Email {get; set;}
public string Telephone {get; set;}
}
À ce stade, vous avez simplement défini des entités correspondantes au schéma de votre base de données. Cependant, Entity Framework est incapable de définir les relations entre les tables Presonne et Affilialtion, ainsi qu’entre les tables Organisme et Affiliation.
Pour matérialiser cela, vous allez donc ajouter une propriété Personne et une propriété Organisme dans la classe Affiliation. La nouvelle définition de cette classe est la suivante :
public partial class Affiliation
{
public int PersonneId { get; set;}
public int OrganismeId { get; set;}
public string Fonction {get; set;}
public string Email {get; set;}
public string Telephone {get; set;}
public virtual Personne Personne {get; set;}
public virtual Organisme Organisme {get; set;}
}
De même, pour matérialiser le fait qu’une Personne peut avoir plusieurs affiliations dans divers organismes et le fait qu’un organisme dispose de plusieurs personnes affiliées, vous allez ajouter également une propriété supplémentaire dans chacune de ces deux tables.
La nouvelle définition de la classe Personne sera donc la suivante :
public partial class Personne
{
public int PersonneId { get; set;}
public string Nom {get; set;}
public string Prenom {get; set;}
public virtual ICollection<Affiliation> Affiliation {get; set;}
}
Et celle de la classe Organisme sera la suivante :
public partial class Organisme
{
public int OrganismeId { get; set;}
public string Nom {get; set;}
public string Adresse {get; set;}
public string Telephone {get; set;}
public virtual ICollection<Affiliation> Affiliation {get; set;}
}
Par défaut, lors de la génération de la base de données correspondante à votre modèle objet, les champs string seront définis par Entity Framework Code First comme des colonnes nvarchar(4000). Pour limiter cette taille, vous allez utiliser l’attribut [MaxLengthAttribute()] de la classe DataAnnotation.
L’attribut [RequiredAttribute] de cette classe sera également utilisé pour définir les propriétés dont les valeurs sont obligatoires. [ScaffoldColumnAttribute] sera utilisé pour spécifier que la clé primaire doit être autoincrément. Enfin, vous allez définir l’attribut [KeyAttribute] pour spécifier les clés étrangères et les tables auxquelles ces clés sont liées.
Le code complet du fichier Personne.cs sera donc le suivant :
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
/// <summary>
/// Summary description for ClassName
/// </summary>
public partial class Personne
{
[ScaffoldColumnAttribute(false)]
public int PersonneId { get; set;}
[MaxLengthAttribute(50)]
[RequiredAttribute]
public string Nom {get; set;}
[MaxLengthAttribute(50)]
[RequiredAttribute]
public string Prenom {get; set;}
public virtual ICollection<Affiliation> Affiliation {get; set;}
}
Celui du fichier Organisme.cs est le suivant :
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
/// <summary>
/// Summary description for ClassName
/// </summary>
public partial class Organisme
{
[ScaffoldColumnAttribute(false)]
public int OrganismeId { get; set;}
[MaxLengthAttribute(50)]
[RequiredAttribute]
public string Nom {get; set;}
[MaxLengthAttribute(50)]
[RequiredAttribute]
public string Adresse {get; set;}
[MaxLengthAttribute(50)]
public string Telephone {get; set;}
public virtual ICollection<Affiliation> Affiliation {get; set;}
}
Et enfin, la nouvelle définition du fichier Affiliation.cs est la suivante :
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Web;
/// <summary>
/// Summary description for ClassName
/// </summary>
public partial class Affiliation
{
[KeyAttribute, ForeignKey("Personne"), Column(Order = 0)]
public int PersonneId { get; set;}
[KeyAttribute, ForeignKey("Organisme"), Column(Order = 1)]
public int OrganismeId { get; set;}
[MaxLengthAttribute(50)]
[RequiredAttribute]
public string Fonction {get; set;}
[MaxLengthAttribute(50)]
public string Email {get; set;}
[MaxLengthAttribute(50)]
public string Telephone {get; set;}
public virtual Personne Personne {get; set;}
public virtual Organisme Organisme {get; set;}
}
La troisième partie portera sur la création du DbContext, de la base de données à partir du modèle objet avec EF Code First et enfin la définition des différentes classes Repository qui seront utilisées.