jeudi 6 avril 2023

Entity Framework vs Dapper


Entity Framework (EF) est ce qu’on appelle un ORM (Object-Relational Mapper), c’est-à-dire un outil qui permet de manipuler une base de données comme si c'était des objets dans ton code (C#, typiquement).

Quand tu parles de "other mapper", tu peux penser à :

  • Dapper (très connu aussi en .NET)

  • NHibernate (plus ancien)

  • ou d’autres ORMs plus légers.


Voici les grandes différences principales :

Entity Framework Dapper / autres ORMs
Type ORM complet (full ORM) Micro-ORM (Dapper) ou ORM différent (NHibernate)
Simplicité Très haut niveau : tu écris peu de SQL Dapper : tu écris toi-même les requêtes SQL
Performance Moins rapide que Dapper (car beaucoup d'abstractions) Dapper : ultra rapide, car léger (presque brut)
Fonctionnalités Migration de bases de données, suivi de changement (Change Tracking), relations complexes (OneToMany, etc.) Dapper : uniquement du mapping objet, pas de suivi d'état, ni de migrations
Apprentissage Facile pour débutant Dapper demande plus de connaissance SQL
Contrôle Moins de contrôle sur le SQL généré (caché par EF) Dapper : contrôle total sur ce que tu fais

Pour donner une image :

  • Entity Framework : "Tu lui dis : Je veux ajouter un client", et il fait tout pour toi (écrit l'INSERT, gère les relations, etc.).

  • Dapper : "Écris ton INSERT INTO Clients (Nom, Age) VALUES (@Nom, @Age) toi-même", et Dapper va juste convertir le résultat en objets.


Donc, tu choisis selon le projet :

  • EF si tu veux aller vite, écrire peu de code, sans trop t’embêter (ex : applications métiers internes, prototypes rapides).

  • Dapper si tu veux des performances maximales ou que tu veux garder le contrôle sur les requêtes SQL.



Entity Framework:

// Modèle Client
public class Client
{
    public int Id { get; set; }
    public string Nom { get; set; }
    public int Age { get; set; }
}
// DbContext
public class AppDbContext : DbContext
{
    public DbSet<Client> Clients { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("ta_chaine_de_connexion");
    }
}
// Utilisation
using (var context = new AppDbContext())
{
    // Ajouter un client
    var client = new Client { Nom = "Jean", Age = 30 };
    context.Clients.Add(client);
    context.SaveChanges();
    // Lire les clients
    var clients = context.Clients.ToList();
}


Dapper:

using System.Data.SqlClient;
using Dapper;

// Modèle Client
public class Client
{
    public int Id { get; set; }
    public string Nom { get; set; }
    public int Age { get; set; }
}

// Utilisation
using (var connection = new SqlConnection("ta_chaine_de_connexion"))
{
    connection.Open();

    // Ajouter un client
    var sqlInsert = "INSERT INTO Clients (Nom, Age) VALUES (@Nom, @Age)";
    var client = new Client { Nom = "Jean", Age = 30 };
    connection.Execute(sqlInsert, client);

    // Lire les clients
    var sqlSelect = "SELECT * FROM Clients";
    var clients = connection.Query<Client>(sqlSelect).ToList();
}

Aucun commentaire:

Enregistrer un commentaire