Bien démarrer avec EF Core sur .NET Framework avec une base de données existanteGetting started with EF Core on .NET Framework with an Existing Database

Dans ce tutoriel, vous générez une application console qui exécute l’accès aux données de base d’une base de données Microsoft SQL Server à l’aide d’Entity Framework.In this tutorial, you build a console application that performs basic data access against a Microsoft SQL Server database using Entity Framework. Vous créez un modèle Entity Framework en rétroconcevant une base de données existante.You create an Entity Framework model by reverse engineering an existing database.

Affichez l’exemple proposé dans cet article sur GitHub.View this article's sample on GitHub.

PrérequisPrerequisites

Créer une base de données de création de blogsCreate Blogging database

Ce tutoriel utilise une base de données de création de blogs sur l’instance LocalDb comme base de données existante.This tutorial uses a Blogging database on the LocalDb instance as the existing database. Si vous avez déjà créé la base de données de création de blogs dans le cadre d’un autre tutoriel, ignorez ces étapes.If you have already created the Blogging database as part of another tutorial, skip these steps.

  • Ouvrir Visual StudioOpen Visual Studio

  • Outils > Connexion à une base de données...Tools > Connect to Database...

  • Sélectionnez Microsoft SQL Server et cliquez sur Continuer.Select Microsoft SQL Server and click Continue

  • Entrez (localdb)\mssqllocaldb comme nom du serveur.Enter (localdb)\mssqllocaldb as the Server Name

  • Entrez master comme nom de la base de données et cliquez sur OK.Enter master as the Database Name and click OK

  • La base de données master figure désormais sous Connexions de données dans l’Explorateur de serveurs.The master database is now displayed under Data Connections in Server Explorer

  • Cliquez avec le bouton de droite sur la base de données dans l’Explorateur de serveurs et sélectionnez l’option Nouvelle requête.Right-click on the database in Server Explorer and select New Query

  • Copiez le script ci-dessous dans l’éditeur de requêtes.Copy the script listed below into the query editor

  • Cliquez avec le bouton de droite sur l’éditeur de requêtes et sélectionnez l’option Exécuter.Right-click on the query editor and select Execute

CREATE DATABASE [Blogging];
GO

USE [Blogging];
GO

CREATE TABLE [Blog] (
    [BlogId] int NOT NULL IDENTITY,
    [Url] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Blog] PRIMARY KEY ([BlogId])
);
GO

CREATE TABLE [Post] (
    [PostId] int NOT NULL IDENTITY,
    [BlogId] int NOT NULL,
    [Content] nvarchar(max),
    [Title] nvarchar(max),
    CONSTRAINT [PK_Post] PRIMARY KEY ([PostId]),
    CONSTRAINT [FK_Post_Blog_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blog] ([BlogId]) ON DELETE CASCADE
);
GO

INSERT INTO [Blog] (Url) VALUES
('http://blogs.msdn.com/dotnet'),
('http://blogs.msdn.com/webdev'),
('http://blogs.msdn.com/visualstudio')
GO

Créer un projetCreate a new project

  • Ouvrez Visual Studio 2017.Open Visual Studio 2017

  • Fichier > Nouveau > Projet...File > New > Project...

  • Dans le menu de gauche, sélectionnez Installé > Visual C# > Windows Desktop.From the left menu select Installed > Visual C# > Windows Desktop

  • Sélectionnez le modèle de projet Application console (.NET Framework).Select the Console App (.NET Framework) project template

  • Vérifiez que le projet cible le .NET Framework 4.6.1 ou ultérieur.Make sure that the project targets .NET Framework 4.6.1 or later

  • Nommez le projet ConsoleApp.ExistingDb et cliquez sur OK.Name the project ConsoleApp.ExistingDb and click OK

Installer Entity FrameworkInstall Entity Framework

Pour utiliser EF Core, installez le package pour le ou les fournisseurs de bases de données à cibler.To use EF Core, install the package for the database provider(s) you want to target. Ce tutoriel utilise SQL Server.This tutorial uses SQL Server. Pour obtenir la liste des fournisseurs disponibles, consultez Fournisseurs de bases de données.For a list of available providers see Database Providers.

  • Outils > Gestionnaire de package NuGet > Console du Gestionnaire de packageTools > NuGet Package Manager > Package Manager Console

  • Exécutez Install-Package Microsoft.EntityFrameworkCore.SqlServer.Run Install-Package Microsoft.EntityFrameworkCore.SqlServer

Dans l’étape suivante, vous utilisez des outils Entity Framework pour rétroconcevoir la base de données.In the next step, you use some Entity Framework Tools to reverse engineer the database. Installez donc le package d’outils.So install the tools package as well.

  • Exécutez Install-Package Microsoft.EntityFrameworkCore.Tools.Run Install-Package Microsoft.EntityFrameworkCore.Tools

Rétroconcevoir le modèleReverse engineer the model

Créons à présent le modèle EF à partir d’une base de données existante.Now it's time to create the EF model based on an existing database.

  • Outils –> Gestionnaire de package NuGet –> Console du Gestionnaire de packageTools –> NuGet Package Manager –> Package Manager Console

  • Exécutez la commande suivante pour créer un modèle à partir de la base de données existante.Run the following command to create a model from the existing database

    Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer
    

Conseil

Vous pouvez spécifier les tables pour lesquelles générer des entités en ajoutant l’argument -Tables à la commande ci-dessus.You can specify the tables to generate entities for by adding the -Tables argument to the command above. Par exemple, -Tables Blog,Post.For example, -Tables Blog,Post.

Le processus d’ingénierie à rebours créé des classes d’entité (Blog et Post) et un contexte dérivé (BloggingContext) en fonction du schéma de la base de données existante.The reverse engineer process created entity classes (Blog and Post) and a derived context (BloggingContext) based on the schema of the existing database.

Les classes d’entité sont des objets C# simples qui représentent les données que vous allez interroger et enregistrer.The entity classes are simple C# objects that represent the data you will be querying and saving. Voici les classes d’entité Blog et Post :Here are the Blog and Post entity classes:

using System;
using System.Collections.Generic;

namespace ConsoleApp.ExistingDb
{
    public partial class Blog
    {
        public Blog()
        {
            Post = new HashSet<Post>();
        }

        public int BlogId { get; set; }
        public string Url { get; set; }

        public ICollection<Post> Post { get; set; }
    }
}
using System;
using System.Collections.Generic;

namespace ConsoleApp.ExistingDb
{
    public partial class Post
    {
        public int PostId { get; set; }
        public int BlogId { get; set; }
        public string Content { get; set; }
        public string Title { get; set; }

        public Blog Blog { get; set; }
    }
}

Conseil

Pour activer le chargement différé, vous pouvez créer des propriétés de navigation virtual (Blog.Post et Post.Blog).To enable lazy loading, you can make navigation properties virtual (Blog.Post and Post.Blog).

Le contexte représente une session avec la base de données.The context represents a session with the database. Il contient des méthodes que vous pouvez utiliser pour interroger et enregistrer des instances des classes d’entité.It has methods that you can use to query and save instances of the entity classes.

using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;

namespace ConsoleApp.ExistingDb
{
    public partial class BloggingContext : DbContext
    {
        public BloggingContext()
        {
        }

        public BloggingContext(DbContextOptions<BloggingContext> options)
            : base(options)
        {
        }

        public virtual DbSet<Blog> Blog { get; set; }
        public virtual DbSet<Post> Post { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
                optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=Blogging;Trusted_Connection=True;");
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Blog>(entity =>
            {
                entity.Property(e => e.Url).IsRequired();
            });

            modelBuilder.Entity<Post>(entity =>
            {
                entity.HasOne(d => d.Blog)
                    .WithMany(p => p.Post)
                    .HasForeignKey(d => d.BlogId);
            });
        }
    }
}

Utiliser le modèleUse the model

Vous pouvez à présent utiliser le modèle pour accéder aux données.You can now use the model to perform data access.

  • Ouvrez Program.cs.Open Program.cs

  • Remplacez le contenu du fichier par le code suivant.Replace the contents of the file with the following code

    using System;
    
    namespace ConsoleApp.ExistingDb
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (var db = new BloggingContext())
                {
                    db.Blog.Add(new Blog { Url = "http://blogs.msdn.com/adonet" });
                    var count = db.SaveChanges();
                    Console.WriteLine("{0} records saved to database", count);
    
                    Console.WriteLine();
                    Console.WriteLine("All blogs in database:");
                    foreach (var blog in db.Blog)
                    {
                        Console.WriteLine(" - {0}", blog.Url);
                    }
                }
            }
        }
    }
    
  • Déboguer > Exécuter sans débogageDebug > Start Without Debugging

    Vous voyez qu’un blog est enregistré dans la base de données et que les détails de tous les blogs s’affichent dans la console.You see that one blog is saved to the database and then the details of all blogs are printed to the console.

    image

Ressources supplémentairesAdditional Resources