Introdução ao EF Core no ASP.NET Core com um banco de dados existenteGetting Started with EF Core on ASP.NET Core with an Existing Database

Neste tutorial, você compila um aplicativo MVC do ASP.NET Core que realiza acesso básico a dados usando o Entity Framework Core.In this tutorial, you build an ASP.NET Core MVC application that performs basic data access using Entity Framework Core. Realize a engenharia reversa de um banco de dados existente para criar um modelo do Entity Framework.You reverse engineer an existing database to create an Entity Framework model.

Exiba o exemplo deste artigo no GitHub.View this article's sample on GitHub.

Pré-requisitosPrerequisites

Instale o software a seguir:Install the following software:

Criar banco de dados de blogCreate Blogging database

Este tutorial usa um banco de dados de blog em sua instância do LocalDb como o banco de dados existente.This tutorial uses a Blogging database on your LocalDb instance as the existing database. Se você já tiver criado o banco de dados de blog como parte de outro tutorial, ignore estas etapas.If you have already created the Blogging database as part of another tutorial, skip these steps.

  • Abrir o Visual StudioOpen Visual Studio
  • Ferramentas > Conectar ao Banco de Dados...Tools -> Connect to Database...
  • Selecione Microsoft SQL Server e clique em ContinuarSelect Microsoft SQL Server and click Continue
  • Insira (localdb)\mssqllocaldb como o Nome do ServidorEnter (localdb)\mssqllocaldb as the Server Name
  • Insira mestre como o Nome do Banco de Dados e clique em OKEnter master as the Database Name and click OK
  • O banco de dados mestre agora é exibido em Conexões de Dados no Gerenciador de ServidoresThe master database is now displayed under Data Connections in Server Explorer
  • Clique com botão direito do mouse no banco de dados em Gerenciador de Servidores e selecione Nova ConsultaRight-click on the database in Server Explorer and select New Query
  • Copie o script listado abaixo para o editor de consultasCopy the script listed below into the query editor
  • Clique com o botão direito do mouse no editor de consultas e selecione ExecutarRight-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

Criar um novo projetoCreate a new project

  • Abra o Visual Studio 2017Open Visual Studio 2017
  • Arquivo > Novo > Projeto...File > New > Project...
  • No menu à esquerda, selecione Instalado > Visual C# > WebFrom the left menu select Installed > Visual C# > Web
  • Selecione o modelo de projeto Aplicativo Web ASP.NET CoreSelect the ASP.NET Core Web Application project template
  • Insira EFGetStarted.AspNetCore.ExistingDb como o nome e clique em OKEnter EFGetStarted.AspNetCore.ExistingDb as the name and click OK
  • Aguarde a caixa de diálogo Novo Aplicativo Web ASP.NET Core aparecerWait for the New ASP.NET Core Web Application dialog to appear
  • Verifique se a lista suspensa da estrutura de destino está definida como .NET Core e a lista suspensa da versão definida como ASP.NET Core 2.1Make sure that the target framework dropdown is set to .NET Core, and the version dropdown is set to ASP.NET Core 2.1
  • Selecione o modelo Aplicativo Web (Model-View-Controller)Select the Web Application (Model-View-Controller) template
  • Certifique-se de que Autenticação esteja definida como Sem AutenticaçãoEnsure that Authentication is set to No Authentication
  • Clique em OKClick OK

Instalar o Entity Framework CoreInstall Entity Framework Core

Para instalar o EF Core, instale o pacote dos provedores do banco de dados do EF Core para o qual você deseja direcionar.To install EF Core, you install the package for the EF Core database provider(s) you want to target. Para obter uma lista de provedores disponíveis, veja Provedores de Banco de Dados.For a list of available providers see Database Providers.

Para este tutorial, não é necessário instalar um pacote de provedor, porque o tutorial usa o SQL Server.For this tutorial, you don't have to install a provider package because the tutorial uses SQL Server. O pacote de provedor do SQL Server está incluído no metapacote Microsoft.AspnetCore.App.The SQL Server provider package is included in the Microsoft.AspnetCore.App metapackage.

Fazer engenharia reversa em seu modeloReverse engineer your model

Agora é hora de criar o modelo EF com base em seu banco de dados existente.Now it's time to create the EF model based on your existing database.

  • Ferramentas > Gerenciador de Pacotes NuGet > Console do Gerenciador de PacotesTools –> NuGet Package Manager –> Package Manager Console
  • Execute o seguinte comando para criar um modelo do banco de dados existente: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 -OutputDir Models

Se você receber um erro indicando The term 'Scaffold-DbContext' is not recognized as the name of a cmdlet, feche e reabra o Visual Studio.If you receive an error stating The term 'Scaffold-DbContext' is not recognized as the name of a cmdlet, then close and reopen Visual Studio.

Dica

Especifique para quais tabelas você deseja gerar entidades adicionando o argumento -Tables para o comando acima.You can specify which tables you want to generate entities for by adding the -Tables argument to the command above. Por exemplo, -Tables Blog,Post.For example, -Tables Blog,Post.

O processo de engenharia reversa criou classes de entidade (Blog.cs & Post.cs) e um contexto derivado (BloggingContext.cs) com base no esquema do banco de dados existente.The reverse engineer process created entity classes (Blog.cs & Post.cs) and a derived context (BloggingContext.cs) based on the schema of the existing database.

As classes de entidade são objetos C# simples que representam os dados que você vai consultar e salvar.The entity classes are simple C# objects that represent the data you will be querying and saving. Veja as classes de entidade Blog e Post:Here are the Blog and Post entity classes:

using System;
using System.Collections.Generic;

namespace EFGetStarted.AspNetCore.ExistingDb.Models
{
    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 EFGetStarted.AspNetCore.ExistingDb.Models
{
    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; }
    }
}

Dica

Para habilitar o carregamento lento, crie propriedades de navegação virtual (Blog.Post e Post.Blog).To enable lazy loading, you can make navigation properties virtual (Blog.Post and Post.Blog).

O contexto representa uma sessão com o banco de dados e permite que você veja e salve as instâncias das classes de entidade.The context represents a session with the database and allows you to query and save instances of the entity classes.

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);
       });
   }
}

Registre seu contexto com injeção de dependênciaRegister your context with dependency injection

O conceito de injeção de dependência é central ao ASP.NET Core.The concept of dependency injection is central to ASP.NET Core. Serviços (como BloggingContext) são registrados com injeção de dependência durante a inicialização do aplicativo.Services (such as BloggingContext) are registered with dependency injection during application startup. Agora, os componentes que exigem esses serviços (como os controladores de MVC) os recebem por meio de propriedades ou parâmetros do construtor.Components that require these services (such as your MVC controllers) are then provided these services via constructor parameters or properties. Para saber mais sobre injeção de dependência, veja o artigo Injeção de dependência no site do ASP.NET.For more information on dependency injection see the Dependency Injection article on the ASP.NET site.

Registrar e configurar o contexto em Startup.csRegister and configure your context in Startup.cs

Para disponibilizar BloggingContext para os controladores do MVC, registre-o como um serviço.To make BloggingContext available to MVC controllers, register it as a service.

  • Abra Startup.csOpen Startup.cs
  • Adicione as declarações using a seguir ao início do métodoAdd the following using statements at the start of the file
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;

Agora é possível usar o método AddDbContext(...) para registrá-lo como um serviço.Now you can use the AddDbContext(...) method to register it as a service.

  • Localize o método ConfigureServices(...)Locate the ConfigureServices(...) method
  • Adicionar o seguinte código realçado para registrar o contexto como um serviçoAdd the following highlighted code to register the context as a service
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });


    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    var connection = @"Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;ConnectRetryCount=0";
    services.AddDbContext<BloggingContext>(options => options.UseSqlServer(connection));
}

Dica

Em um aplicativo real, normalmente você colocaria a cadeia de conexão em um arquivo de configuração ou variável de ambiente.In a real application you would typically put the connection string in a configuration file or environment variable. Para simplificar, este tutorial define isso no código.For the sake of simplicity, this tutorial has you define it in code. Para saber mais, confira Cadeias de conexão.For more information, see Connection Strings.

Criar um controlador e exibiçõesCreate a controller and views

  • Clique com o botão direito do mouse na pasta Controladores no Gerenciador de Soluções e selecione Adicionar > Controlador...Right-click on the Controllers folder in Solution Explorer and select Add -> Controller...
  • Selecione Controlador MVC com exibições, usando o Entity Framework e clique em OkSelect MVC Controller with views, using Entity Framework and click Ok
  • Defina Classe de modelo como Blog e Classe de contexto de dados como BloggingContextSet Model class to Blog and Data context class to BloggingContext
  • Clique em AdicionarClick Add

Executar o aplicativoRun the application

Agora, você pode executar o aplicativo para vê-lo em ação.You can now run the application to see it in action.

  • Depurar > Iniciar Sem DepuraçãoDebug -> Start Without Debugging

  • O aplicativo é compilado e aberto em um navegador da WebThe application builds and opens in a web browser

  • Navegue até /BlogsNavigate to /Blogs

  • Clique em Criar NovoClick Create New

  • Insira uma Url para o novo blog e clique em CriarEnter a Url for the new blog and click Create

    Criar página

    Página de índice

Próximas etapasNext steps

Para obter mais informações sobre como criar o scaffolding de um contexto e classes de entidade, veja os seguintes artigos:For more information about how to scaffold a context and entity classes, see the following articles: