Premiers pas avec Entity Framework Core
Modèle, interrogation et enregistrement des données
Modèle
Avec EF Core, l’accès aux données est effectué à l’aide d’un modèle. Un modèle est composé de classes d’entités et d’un contexte dérivé qui représente une session avec la base de données, vous permettant d’interroger et d’enregistrer des données.
Vous pouvez générer un modèle à partir d’une base de données existante, coder manuellement un modèle pour qu’il corresponde à votre base de données ou utiliser EF Migrations pour créer une base de données à partir de votre modèle (et la faire évoluer au fur et à mesure que votre modèle change au fil du temps).
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
namespace Intro
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=MyDatabase;Trusted_Connection=True;");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
}
Requête
Les instances de vos classes d’entités sont extraites de la base de données à l’aide de LINQ (Language Integrated Query).
using (var db = new BloggingContext())
{
var blogs = db.Blogs
.Where(b => b.Rating > 3)
.OrderBy(b => b.Url)
.ToList();
}
La sauvegarde des données
Les données sont créées, supprimées et modifiées dans la base de données à l’aide d’instances de vos classes d’entité.
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Add(blog);
db.SaveChanges();
}
Suppression de données
Les instances de vos classes d’entités sont extraites de la base de données à l’aide de LINQ (Language Integrated Query).
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
db.Blogs.Attach(blog);
db.Blogs.Remove(blog);
db.SaveChanges();
}
Mise à jour des données
Les données sont mises à jour dans la base de données à l’aide d’instances de vos classes d’entités.
using (var db = new BloggingContext())
{
var blog = new Blog { Url = "http://sample.com" };
var entity = db.Blogs.Find(blog);
entity.Url = "http://sample2.com";
db.SaveChanges();
}
Database First dans Entity Framework Core avec une bibliothèque de classes et SQL Server
D’accord, il m’a fallu environ une journée pour le comprendre, alors je poste ici les étapes que j’ai suivies pour que ma base de données fonctionne d’abord dans un “Projet de classe (.NET Core)”, avec une application Web .NET Core.
Étape 1 - Installer .NET Core
Assurez-vous que vous utilisez .NET Core et non DNX (Astuce : vous devriez pouvoir voir l'option .NET Core lors de la création d'un nouveau projet)
- Si ce n’est pas le cas, téléchargez depuis [ici][1]
Si vous rencontrez des problèmes lors de l’installation de .NET Core (l’erreur est quelque chose comme Visual Studio 2015 Update 3 non installé correctement) - Vous pouvez exécuter l’installation à l’aide de la commande : [DotNetCore.1.0.0-VS2015Tools.Preview2.exe SKIP_VSU_CHECK=1
] – Ce qui empêchera l’installation d’effectuer la vérification de Visual Studio [Problème Github][2]
[![entrez la description de l’image ici][3]][3]
Étape 2 - Créer les projets
Créez une nouvelle application Web ASP.NET Core -> Sélectionnez ensuite l’application Web dans l’écran suivant
[![entrez la description de l’image ici][4]][4]
Ajouter un projet “Bibliothèque de classes (.NET Core)”
[![entrez la description de l’image ici][5]][5]
Étape 3 - Installation des packages EF
Ouvrez votre fichier project.json
de la bibliothèque de classes et collez ce qui suit, puis enregistrez le fichier :
{
"version": "1.0.0-*",
"dependencies": {
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"NETStandard.Library": "1.6.0"
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"net46": {
},
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-*"
}
}
}
}
}
Cela devrait restaurer les packages sous “Références”
[![entrez la description de l’image ici][6]][6]
—————- OU
Vous pouvez les installer à l’aide du gestionnaire de packages Nuget en exécutant les commandes suivantes dans la console du gestionnaire de packages.
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design
Remarque : Installez un package à la fois - si vous obtenez une erreur après l’installation
Microsoft.EntityFrameworkCore.Tools
Changez ensuite le contenu de votre section de frameworks project.json
en ceci :
"frameworks": {
"net46": {
},
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-*"
}
}
}
}
Étape 4 - Création du modèle de base de données
Maintenant, pour générer la base de données, exécutez la commande suivante dans la Console du gestionnaire de packages
(N’OUBLIEZ PAS de modifier la chaîne de connexion à votre base de données)
Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer
Cela vous donnera l’erreur sur le projet de démarrage :
[![entrez la description de l’image ici][7]][7]
Pour cela, vous devez ajouter les mêmes références que vous avez ajoutées à la bibliothèque de classes à l’application Web .NET
Ouvrez donc votre project.json
pour l’application Web,
Sous “dépendances”, ajoutez :
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
et sous “outils”, ajoutez :
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
Après avoir apporté les modifications, enregistrez le fichier.
Voici à quoi ressemble mon project.json
[![entrez la description de l’image ici][8]][8]
Ensuite, exécutez à nouveau la commande dans la console du gestionnaire de packages sur la bibliothèque de classes :
Si vous n’avez pas encore ajouté la référence de votre bibliothèque de classes à l’application Web, vous obtiendrez cette erreur :
[![entrez la description de l’image ici][9]][9]
pour résoudre ce problème, ajoutez la référence de votre bibliothèque de classes à votre application Web :
[![entrez la description de l’image ici][10]][10]
Pour terminer
Exécutez à nouveau la commande - dans la Console du gestionnaire de packages
:
Scaffold-DbContext "Server=. ; Database=DATABASE; user id= USER ; password = PASSWORD;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
Cela devrait créer le dossier Entities under Models, dans la bibliothèque de classes
[![entrez la description de l’image ici][11]][11]
Passer une chaîne de connexion
Dans mon cas ici, nous avons une application multi-locataires, dans laquelle chaque client a sa propre base de données, par ex. Client_1, Client_2, Client_3. La chaîne de connexion devait donc être dynamique.
Nous avons donc ajouté une propriété de chaîne de connexion à un constructeur et l’avons transmise au contexte dans la méthode OnConfiguring
public partial class ClientContext
{
private readonly string _connectionString;
public ClientContext(string connectionString) : base()
{
_connectionString = connectionString;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_connectionString);
}
}
et l’a utilisé comme ceci:
public void TestConnection()
{
var clientId = 1;
var connectionString = string.Format("Server=192.168.0.211; Database=Client_{0}; user id= USER; password = PWD;", clientId);
using (var clientContext = new ClientContext(connectionString))
{
var assets = clientContext.Users.Where(s => s.UserId == 1);
}
}
[1] : https://www.microsoft.com/net [2] : https://github.com/aspnet/Home/issues/1626 [3] : http://i.stack.imgur.com/1mQZw.png [4] : http://i.stack.imgur.com/IhuGi.png [5] : http://i.stack.imgur.com/QjqAg.png [6] : http://i.stack.imgur.com/R47M6.png [7] : http://i.stack.imgur.com/fz7V3.png [8] : http://i.stack.imgur.com/BtAuH.png [9] : http://i.stack.imgur.com/q9R0a.png [10] : http://i.stack.imgur.com/xPkRz.png [11] : http://i.stack.imgur.com/Tgyi1.png
Ajout de packages au projet
Pour ajouter EntityFrameworkCore à votre projet, mettez à jour le fichier project.json
(ajoutez de nouvelles lignes dans les sections dependencies
et tools
):
"dependencies": {
...
"Microsoft.EntityFrameworkCore.SqlServer": "1.0.0",
"Microsoft.EntityFrameworkCore.SqlServer.Design": "1.0.0",
"Microsoft.EntityFrameworkCore.Design": {
"version": "1.0.0",
"type": "build"
},
},
"tools": {
...
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
}
N’oubliez pas d’exécuter dotnet restore
pour télécharger ces packages depuis Internet.
Si vous utilisez un SGBDR autre que Microsoft SQLServer - remplacez Microsoft.EntityFrameworkCore.SqlServer
par la version correcte (Microsoft.EntityFrameworkCore.Sqlite
, Npgsql.EntityFrameworkCore.PostgreSQL
ou autre - consultez votre documentation RDBMS pour le package recommandé ).