C# / Accéder à une base de données à l’aide d’Entity Framework (2/2)

Dans mon article précédent, je vous présentais Entity Framework, un outil puissant permettant de mapper une base de données à des objets relationnels, et ainsi faire abstraction des requêtes SQL.
Voyons maintenant comment s’en servir.

Connexion à la base de données

Entity nous a « transformé » (plutôt « mappé ») notre base de données en un simple objet parcourable.

  • Cas 1 : Le mot de passe est inclus dans le fichier de configuration

    Voyons maintenant pour nous connecter. Il nous suffit d’une ligne.

    ecommerceEntities db = new ecommerceEntities();

    Le constructeur par défaut va chercher la chaîne de connexion contenue dans le fichier App.config / Web.config.

  • Cas 2 : Le mot de passe est à préciser dans votre code

    Il existe un second constructeur permettant d’utiliser une autre chaîne de connexion. Pour ajouter le mot de passe, nous allons réécrire la chaîne de connexion. Voici un exemple :

    // Définition du mot de passe
    string password = "password";
    
    // On est prêt à inclure le mot de passe dans la chaîne de connexion
    string suffix = string.Format(";Password={0}", password);
    
    /* On récupère celle-ci depuis le fichier de configuration
    Veillez à bien inclure la référence System.Configuration */
    string connectionString = ConfigurationManager.ConnectionStrings["ecommerceEntities"].ConnectionString;
    
    // Modification de la chaîne en y intégrant le mot de passe
    connectionString = string.Format("{0}{1}\"", connectionString.Substring(0, connectionString.Length - 1), suffix);
    
    // Connexion à la base de données
    ecommerceEntities db = new ecommerceEntities(connectionString);

Lire des données

  • Lister tous les enregistrements

    Connexion établie ! Affichons à présent la liste de nos clients dans une ComboBox.

    comboBox.ItemsSource = db.client;
  • Filtrer les résultats

    On va compliquer un peu. Cette fois, on veut la liste des produits ayant un prix inférieur à 10€.

    var produits = db.produit.Where(p => p.prix < 10.0);

    On utilise ici une « expression lamba ». On associe une variable p à chaque produit de notre liste pour effectuer notre tri. On peut très bien mettre plusieurs conditions.

    var produits = db.produit.Where(p => p.prix > 5.0 && p.prix < 10.0);

    Vous pouvez lire aussi le tutoriel sur les expressions lambda d’OpenClassRooms.

  • Lire un enregistrement

    Je ne pouvais pas vous montrer ceci avant de vous parler des expressions lambas 🙂

    produit p1 = db.client.First(p => p.code_produit == 1);
  • Trier les résultats

    • Tri dans l’ordre croissant par nom :
      var produits = db.produit.OrderBy(c => c.nom);
    • Tri dans l’ordre décroissant par prénom :
      var produits = db.produit.OrderByDescending(c => c.prenom);
  • Limiter les résultats

    On veut les 5 premiers résultats uniquement.

    var commandes = db.commande.Take(5);

    On veut « passer » les 3 premiers résultats.

    var commandes = db.produit.Skip(3);

    Il est possible de cumuler les méthodes Skip() et Take().

  • Compter le nombre de résultats

    //Nombre de clients
    int nbClients = db.client.Count;
    
    // Nombre de clients ayant passé plus de 5 commandes
    int nbCommandes = db.client.Where(c => c.commandes.Count > 5).Count;

Ajouter une entrée dans une table

Il suffit de créer un objet client (généré par Entity) et de le « mapper » à la base.

// Création de notre client
client cli = new client()
{
   nom = "Dupont";
   prenom = "Jean";
   adresse = "160 rue Solferino 59000 Lille"
};

// Ajout à la base de données
db.client.AddObject(cli);

// Obligatoire ! On confirme les changements sur la base
db.SaveChanges();

Modifier une entrée dans une table

// Récupération du client ayant l'ID n°5
 client cli = db.client.Where(c => c.code_client == 5);

// Modification de l'adresse par exemple
 cli.adresse = "1 Grand Place 59000 Lille";

// Sauvegarde des modifications
 db.SaveChanges();

Supprimer une entrée d’une table

// Récupération du client ayant l'ID n°5
 client cli = db.client.Where(c => c.code_client == 5);

// Demande de suppression du client
 db.client.DeleteObject(cli);

// Sauvegarde des modifications
 db.SaveChanges();

Relations n-n: Commandes contenant un produit ciblé

La relation entre les tables produit et commande est de type N-N.
Pour récupérer, par exemple, les commandes passées comportant un produit en particulier, voici comment faire :

// Connaître tous les commandes passées possédant le produit n°3
var commandes = db.commande.Where(c => c.produit.Any(p => p.code_produit == 3));

Conclusion

Je penses que nous avons fait le tour… Si vous vous demandez toujours comment Entity procède pour interroger la base de données, sachez que celui-ci génère… des requêtes SQL ! Tout ce travail de requêtage assez fastidieux est entièrement géré par l’outil.

Ainsi vous gagnez en temps et vous ne risquez jamais de rencontrer d’erreurs de syntaxes 🙂

Lien Permanent pour cet article : https://www.jbvigneron.fr/parlons-dev/csharp-acceder-a-une-base-de-donnees-a-l-aide-d-entity-framework-2/

7 Commentaires

Passer au formulaire de commentaire

  1. Merci JB,
    ça m’a un peu servi dans mon entreprise !!

    As tu vu mon nouveau blog ?

  2. Merci,
    idéal pour découvrir cette approche même si c’est pas top comme frame . Je préfère le SQL traditionnel, on maîtrise plus de choses

  3. Gaffe aux erreurs de syntaxe en revanche 😉

  4. Merci, je découvre et bcp d’aspects me sont encore assez flou

    • Baudouin sur 27 juillet 2015 à 2h51
    • Répondre

    Bonjour,

    J’ai un projet cadrant avec le thème de votre post. Ainsi l’ai-je téléchargé afin de pouvoir l’adapter à mon projet. Cependant lorsque je compile mon projet,je rencontre l’ erreur suivante :
     » Data binding directly to a store query (DbSet, DbQuery, DbSqlQuery, DbRawSqlQuery) is not supported. Instead populate a DbSet with data, for example by calling Load on the DbSet, and then bind to local data. For WPF bind to DbSet.Local. For WinForms bind to DbSet.Local.ToBindingList(). For ASP.NET WebForms you can bind to the result of calling ToList() on the query or use Model Binding, for more information see http://go.microsoft.com/fwlink/?LinkId=389592. »
    Pourriez-Vous m’aider?

    Merci de votre réponse rapide !

  5. I’ve been absent for a while, but now I remember why I used to love this website. Thanks, I’ll try and check back more frequently. How frequently you update your site? aggageecacbcagab

  6. Rebonjour,
    Suite à mon précédent message, j’ai trouvé mon erreur, je n’avais pas spécifié « using System.Data.Entity; » dans l’en-tète de mon projet.
    Donc l’histoire est résolue. Veuillez m’excuser.
    Cordialement

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.

Verified by MonsterInsights