Archives Wild Code School
C#

Entity Framework - Code First

Quête 40 sur 46

Après cette quête tu sauras créer un schéma de base de données relationnel en partant d'un diagramme de classes

Un ORM

Ecrire les modules se connectant à la base de données pour y récupérer des informations est une tâche chronophage. En effet, il y a souvent beaucoup de code boilerplate et donc une énorme quantité de code uniquement réservé aux requêtes à faire en base de données.

Heureusement pour nous, nous ne sommes pas contraints à constamment écrire tous les comportements des modules bases de données. Nous pouvons remplacer tout ce code par un ORM.

Un **ORM **?

L'acronyme ORM se définit en tant que Object Relational Mapper. C'est donc un "traceur de relation d'objets.

On est pas très avancés avec ta définition !

Comme expliqué plus haut, un ORM permet d'abstraire la quasi-totalité des opérations en base de données. Un **ORM **permet de faire correspondre des classes à des instances en base de données et vice-versa. Un ORM permet de créer une structure de base de données en partant d'un code. Il es t aussi capable de faire l'inverse bien entendu.

Et on va utiliser Entity Framework ?

Entity Framework sera notre premier ORM. Il est puissant et est mature. Il peut être utilisé en production et c'est un des **ORM **de-facto les plus utilisés dans le monde C#.

↗
Qu'est-ce qu'un ORM ?

Un article sur l'utilité d'un ORM

blog.bitsrc.io
↗
Pourquoi utiliser un ORM ?

Site de tutoriels sur Entity Framework

learnentityframeworkcore.com

L'approche code-first

Durant cette quête, nous allons utiliser l'approche code-first. C'est une approche où la structure de la base de données est crée en suivant le code que tu écris. La structure de ta base va pouvoir évoluer en fonction de ton code.

Afin de permettre à Entity Framework de générer le modèle de ta base de données, il faut que tu écrives ton code d'une certaine manière.

Les packages NuGet

Avant de pouvoir utiliser EntityFramework, tu vas avoir besoin de télécharger deux paquets NuGet. Il faut que tu télécharges EntityFrameworkCore pour installer la base du framework et EntityFrameworkCore.SqlServer pour pouvoir connecter EntityFramework à une base de données SqlServer.

Le contexte

Entity Framework met à disposition une classe DbContext qui permet d'interagir avec la base de données et les entités. DbContext permet de réaliser toutes les opérations concernant l'ajout, la suppression et la mise à jour des entités en base de données.

cs
using Microsoft.EntityFrameworkCore;
using System.Data
class ShopContext : DbContext // DbContext overriden
{
    // Product entites can be accessed by this context
    public virtual DbSet<Product> Products { get; set; }
    // Shop entities can be accessed by this context
    public virtual DbSet<Shop> Shops { get; set; }

    // OnConfiguring is a hook that executes while the context configures itself
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // I add a connection to a database instance while the context configures
        optionsBuilder.UseSqlServer(
            @"Server=LOCALHOST\SQLEXPRESS;Database=Shop;Integrated Security=True");
    }
}

Shop:

csharp
using System.Collections.Generic;
class Shop
{
    public Guid ShopId { get; set; }
    public String City { get; set; }
    public ICollection<Product> Products { get; set; }
}

Chaque magasin possède une liste de produits. Un schéma permettant de modéliser cette relation sera crée grâce à EntityFramework.

Product:

cs
class Product
{
    public Guid ProductId { get; set; }
    public Double Price { get; set; }
    public String Name { get; set; }
}

Il est important de noter qu'aucune entité ne peut être créer sans clé primaire. Entity Framework t'inderdira cette hérésie. Afin de satisfaire Entity Framework, il faut ajouter une propriété [NomClasse]Id à ta classe.

Pourquoi un GUID ?

Une clé primaire n'est pas contrainte à utiliser un entier. Toutes sortes de valeurs peuvent lui être affectées. Microsoft a développé un système d'identification des objets, et le GUID est une implémentation de ce système. Le GUID permet d'identifier uniquement un objet. Microsoft énonce qu'il y a plus de chances qu'une météorite nous atteigne en un an qu'une collision sur 30 milliards de GUID.

On peut donc identifier chacun de nos objets par des GUID. Cela nous permettra de les retrouver globalement si besoin.

Et la fonction Main alors ?

Effectivement, afin de lancer ton programme, nous allons devoir écrire le point d'éntrée Main_. _Le voici.

cs
static class Program
{
    static void Main()
    {
        using (var context = new MyContext())
        {
            // I wipe out my database at each execution
            context.Database.EnsureDeleted();
            // Then I recreate it
            context.Database.EnsureCreated();
   
            var shop = new Shop
            {
                City = "Strasbourg"
            };

            shop.Products = new List<Product>
            {
                new Product { Name = "Bananes", Price = 10.00 },
                new Product { Name = "Framboises", Price = 7.00 },
                new Product { Name = "Pommes", Price = 5.00 },
            };

            context.Add(shop);
            // After the shop is added, his relatonships will too
            // if they are defined          
            context.SaveChanges();
            // Once changes are added, they must be saved to the database
            // unless you will have an unexisting one        
        }
    }
}

↗
Using statement

Référence officielle sur une utilisation du mot-clé using

docs.microsoft.com
↗
L'approche code-first

Les concepts

tutorialspoint.com
↗
L'approche code-first

L.a pratique

tutorialspoint.com

Une grosse somme à se faire

Mr. Richard ne sait tellement plus quoi faire de son argent qu'il n'arrive même plus à le compter. Il est devenu tellement riche qu'il peut même se passer de payer les employés travaillant pour lui. Encore une aubaine pour lui: il veut travailler avec toi pour l'aider à construire sa comptabilité à nouveau.

Il y a peu, une des demeurs de Mr.Richard a été brûlée par des militants anti-capitalistes. Manque de bol, la paperasses concernant trois de ses comptes offshore a aussi brûlé. Il te demander une application qui lui permet de calculer ses taux d'épargnes. En échange, il aimerait t'apprendre quelques bases sur les virements à l'étranger et sur l'optimisation fiscale. Il te fera aussi profiter d'une partie de son réseau.

Challenge

Un taux d'épargne intéressant

Mr.Richard est paranoïaque. Il ne veut acheter aucun logiciel dont il ne maîtrise pas le code. Il désire donc que tu lui codes un programme faisant le calcul de toutes ses épargnes durant les trois dernières années.

Mr. Richard possède deux sociétés écran.Voici les trois comptes épargnes de Mr.Richard:

  • Taux d'épargne: 5% chaque mois. Fonds déposés initialement: 2 000 000 €.

  • Taux d'épargne: 15% chaque année. Fonds déposés initialement: 250 000 €

  • Taux d'épargne: 2% chaque année. Fonds déposés initialement: 10 000 000 €

Critères de validation

  • Un jeu de données correspondant à l'énoncé est crée en utilisant Entity Framework

  • Aucun code SQL ne fait partie de la solution

  • Une classe SavingAccount représente un compte épargne

  • Une classe Person possède un ou plusieurs comptes épargnes

  • Une classe SavingCalculator réalise les calculs sur les totaux d'épargne de Mr.Richard

  • Dans la console sont affichés chacun des comptes et taux d'épargne associés