jeudi 28 juin 2012

ADO.NET - Entity Framework

Entity Framework 4.1 ou plus introduit une nouvelle API basée sur la classe DbContext qui propose trois approches :

  • "Model First" : le modèle des données est créé via le concepteur Visual Studio
  • "Database First" : le modèle des données est créé à partir d'une base de données existante, modifié dans Visual Studio. Un modèle T4 permet de générer le code des entités correspondantes (par défaut avec l'ancienne API ObjectContext ou sur demande avec la nouvelle API DbContext).
  • "Code First" : le modèle des données est défini directement dans le code de l'application.
Le fichier utilisé sera cette fois C:\Program Files\Microsoft SQL Server Compact Edition\v4.0\Samples, la version 3.5 ne permettant pas de récupérer les valeurs "identity". De même le fichier de configuration de l'application est changé pour adresser cette version :
<configuration>
  <connectionStrings>
    <add name="Data" connectionString="Data Source=Northwind.sdf" providerName="System.Data.SqlServerCe.4.0"/>
  </connectionStrings>
</configuration>
Le fichier Category.cs va permettre de décrire la classe qui va représenter nos données :
namespace ConsoleApplication1
{
    public class Category
    {
        public virtual int CategoryID { get; set; }
        public virtual string CategoryName { get; set; }
    }
}
Le fichier Data.cs décrit le "contexte" qui permettra de prendre en charge la mise à jour de la base :
using System.Data.Entity;
namespace ConsoleApplication1
{
    public class Data : DbContext
    {
        public DbSet Categories { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity().Property(p => p.CategoryID).HasColumnName("Category ID");
            modelBuilder.Entity().Property(p => p.CategoryName).HasColumnName("Category Name");
        }
    }
}
La méthode OnModelCreating permet notamment d'indiquer les noms des colonnes présentes dans la base de données. Par convention, la table porte le même nom que la classe et une propriété dont le nom se termine par "id" est une clé primaire. Au final, le code permet d'accéder très naturellement à la liste des catégories :
using System;
using System.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Data data = new Data();
            foreach (var item in from o in data.Categories orderby o.CategoryName ascending select o)
            {
                item.CategoryName = item.CategoryName.EndsWith("z") ? item.CategoryName.Substring(0,item.CategoryName.Length - 1) : item.CategoryName + "z";
                Console.WriteLine(item.CategoryName);
            }
            data.SaveChanges();
            Console.ReadKey();
        }
    }
}
La ligne foreach peut également être exprimée sous la forme foreach(var item in data.Categories.OrderBy((o)=>o.CategoryName)).

Aucun commentaire:

Enregistrer un commentaire