.Net

Retour sur les Techdays : EntityFramework 7

Fév 13, 2015

Arnaud Voisin

La journée du mardi 10 février des Techdays a été marquée par une avalanche d’annonces. Pour certaines personnes les découvertes fûrent totales, mais en réalité toutes les annonces avaient déjà été faites par Microsoft le semestre dernier. L’écosystème .Net va changer et le Stack Asp.Net profitera de cette évolution en premier !

EntityFramework pouvant être monté en middleware dans Asp.Net 5, il a fallu l’adapter à la nouvelle philosophie du Stack. Cependant, il y a encore un peu de flou autour de l’avancement du développement, la communauté espérait donc avoir quelques informations à se mettre sous la dent. Attention, pour ceux qui n’ont pas suivi l’actualité autour de EF7, vous allez être surpris !

 

Introduction

Lors de la session Sébastien PERTUS a confirmé l’annonce phare : EntityFramework 7 sera Code First only (Lui, définit l’approche comme du Code based modeling, une définition plus précise à ses yeux). Fini donc les approches Model et Database first et adieu le fichier EDMX. L’intérêt principal de conserver une seule approche est clairement le gain de productivité et l’allègement de la librairie. Pour ceux qui sont restés sur les deux autres approches, vous disposez de temps pour migrer (ou non) vos applications, la nouvelle version de l’ORM est encore loin d’être prête !

L’équipe Microsoft a retravaillé en profondeur le Framework et l’a découpé de façon à ce qu’il soit plus modulaire. L’architecture est donc maintenant composée de plusieurs bibliothèques centrales (Core, Relational, Command) et de Providers spécifiques aux environnements. L’objectif affiché par l’équipe est très claire la dessus : EF sera cross-platform et gérera plusieurs types de bases, relationnelles ou non. Microsoft annonce déjà le support de SqlServer, SqlLite, Azure Table Storage, Redis et bientôt DocumentDB… rien que ça ! Evidement les autres SGBD populaires seront de la partie, mais il faudra être un peu patient, il y a encore beaucoup de travail à abattre !

Côté améliorations on peut noter un gain de performances et une meilleure structure des requêtes SQL (nos amis DBA apprécieront, l’équipe EF a travaillé sur cette partie pour eux !). Pour ma part, j’ai vraiment apprécié découvrir qu’ils ont enfin mis en place un système de batching pour insérer des données en masse ! Un point que l »on ne pourra plus reprocher à l’ORM. Voyons ça tout de suite avec un exemple.

 

Exemple

Avant de commencer il faut prendre en considération qu’EF7 est en version Pre-Release. Il faut donc utiliser la version 2.8.3 de NuGet et la version Nightly build disponible via le package source MyGet : ici. Pour l’installer depuis la Package Manager Console, tapez :

PM> Install-Package EntityFramework.SqlServer –Pre

Pour l’exemple je vais utiliser la classe Product suivante :

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreationDate { get; set; }
}

Pour faire mon benchmark j’ai utilisé les DbContext suivant :

EF6 :

using System.Data.Entity;

namespace EF6.Sample
{
    public class ProductContext : DbContext
    {
        public DbSet<Product> Products { get; set; }

        public ProductContext()
            : base("MyConnectionString")
        {
            
        }
    }
}

EF7 :

using Microsoft.Data.Entity;

namespace EF7.Sample
{
    public class ProductContext : DbContext
    {
        public DbSet<Product> Products { get; set; }

        protected override void OnConfiguring(DbContextOptions options)
        {
            base.OnConfiguring(options);
	    options.UseSqlServer("MyConnectionString");
        }
    }
}

A présent pour chaque version d’EntityFramework nous allons lancer 2000 insertions de données :

using System;
using System.Diagnostics;

namespace EF6.Sample
{
    public class Program
    {
        static void Main()
        {
            using (var dbContext = new ProductContext())
            {
                var stopwatch = new Stopwatch();

                stopwatch.Start();

                for (var i = 0; i < 2000; i++)
                {
                    dbContext.Products.Add(new Product
                    {
                        CreationDate = DateTime.Now,
                        Id = i + 1,
                        Name = "Product"
                    });

                }
                dbContext.SaveChanges();
                stopwatch.Stop();
                Console.WriteLine("Executed in : {0}ms", stopwatch.ElapsedMilliseconds);
                Console.ReadKey();
            }
        }
    }
}

Le résultat du temps d’exécution est sans appel !

EF6 :

EF7 :

Grâce au batching, EF7 est presque dix fois plus rapide que la version précédente pour de l’insertion en masse.

 

Conclusion

EntityFramework change et pour ceux qui étaient encore réticents au Code First il va falloir vous y faire. Le Code First souffre encore de quelques légendes urbaines et il faudra un peu de temps pour balayer les aprioris. En attendant, la nouvelle version de l’ORM va murir et avec la communauté grandissante, des Providers permettant de gérer de nombreuses bases de données vont fleurir.

Vous pouvez retrouver l’ensemble du code source utilisé pour le benchmark sur mon Github : ici

A bientôt,

Sylvain

1 Commentaire

  1. Yanal

    Salut,

    Merci pour cet article mais les liens vers les images sont cassés. Pourriez-vous les corriger?

    Yanal

    Réponse

Soumettre un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Découvrez nos autres articles

Aller au contenu principal