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

One Comment

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.