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);
- Tri dans l’ordre croissant par nom :
-
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 🙂
7 Commentaires
Passer au formulaire de commentaire
Merci JB,
ça m’a un peu servi dans mon entreprise !!
As tu vu mon nouveau blog ?
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
Auteur
Gaffe aux erreurs de syntaxe en revanche 😉
Merci, je découvre et bcp d’aspects me sont encore assez flou
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 !
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
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