Entity Framework - Code First
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#.
Un article sur l'utilité d'un ORM
Site de tutoriels sur Entity Framework
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.
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:
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:
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.
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
}
}
}
Référence officielle sur une utilisation du mot-clé using
Les concepts
L.a pratique
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
SavingAccountreprésente un compte épargne -
Une classe
Personpossède un ou plusieurs comptes épargnes -
Une classe
SavingCalculatorré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