Introducción a EF Core en ASP.NET Core con una base de datos existenteGet started with EF Core on ASP.NET Core with an existing database

En este tutorial compilará una aplicación de MVC de ASP.NET Core que realiza el acceso a datos básicos mediante Entity Framework Core.In this tutorial, you build an ASP.NET Core MVC application that performs basic data access using Entity Framework Core. Para crear un modelo de Entity Framework, usará ingeniería inversa en una base de datos existente.You reverse engineer an existing database to create an Entity Framework model.

Vea un ejemplo de este artículo en GitHub.View this article's sample on GitHub.

Requisitos previosPrerequisites

Instale el software siguiente:Install the following software:

Creación de una base de datos para blogsCreate Blogging database

En este tutorial se usa una base de datos para blogs en la instancia de LocalDB como la base de datos existente.This tutorial uses a Blogging database on your LocalDb instance as the existing database. Si ya creó la base de datos de blogs como parte de otro tutorial, omita estos pasos.If you have already created the Blogging database as part of another tutorial, skip these steps.

  • Apertura de Visual StudioOpen Visual Studio
  • Herramientas -> Conectar con base de datos...Tools -> Connect to Database...
  • Seleccione Microsoft SQL Server y haga clic en ContinuarSelect Microsoft SQL Server and click Continue
  • Escriba (localdb)\mssqllocaldb como el nombre del servidorEnter (localdb)\mssqllocaldb as the Server Name
  • Escriba maestra como el nombre de la base de datos y haga clic en AceptarEnter master as the Database Name and click OK
  • La base de datos maestra ahora aparece en Conexiones de base de datos del Explorador de servidoresThe master database is now displayed under Data Connections in Server Explorer
  • Haga clic con el botón derecho en la base de datos en el Explorador de servidores y seleccione Nueva consultaRight-click on the database in Server Explorer and select New Query
  • En el editor de consultas, copie el script que aparece a continuación.Copy the script listed below into the query editor
  • Haga clic con el botón derecho en el editor de consultas y seleccione EjecutarRight-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

Crear un proyecto nuevoCreate a new project

  • Abra Visual Studio 2017Open Visual Studio 2017
  • Archivo > Nuevo > Proyecto...File > New > Project...
  • En el menú de la izquierda, seleccione Instalado > Visual C# > Web.From the left menu select Installed > Visual C# > Web
  • Seleccione la plantilla de proyecto Aplicación web ASP.NET Core.Select the ASP.NET Core Web Application project template
  • Escriba EFGetStarted.AspNetCore.ExistingDb como nombre (tiene que coincidir con exactamente el espacio de nombres que se usa más adelante en el código) y haga clic en AceptarEnter EFGetStarted.AspNetCore.ExistingDb as the name (it has to match exactly the namespace later used in the code) and click OK
  • Espere que aparezca el cuadro de diálogo Nueva aplicación web de ASP.NET CoreWait for the New ASP.NET Core Web Application dialog to appear
  • Asegúrese de que el menú desplegable de la plataforma de destino esté establecido en .NET Core y de que el menú desplegable de versión esté establecido en ASP.NET Core 2.1.Make sure that the target framework dropdown is set to .NET Core, and the version dropdown is set to ASP.NET Core 2.1
  • Seleccione la plantilla Aplicación web (Model-View-Controller) .Select the Web Application (Model-View-Controller) template
  • Asegúrese de que la autenticación esté establecida en Sin autenticación.Ensure that Authentication is set to No Authentication
  • Haga clic en Aceptar.Click OK

Instalación de Entity Framework CoreInstall Entity Framework Core

Para instalar EF Core, instale el paquete de los proveedores de bases de datos de EF Core que quiera establecer como destino.To install EF Core, you install the package for the EF Core database provider(s) you want to target. Para una lista de los proveedores disponibles, consulte Proveedores de bases de datos.For a list of available providers see Database Providers.

Para este tutorial no tendrá que instalar ningún paquete de proveedor porque se usa SQL Server.For this tutorial, you don't have to install a provider package because the tutorial uses SQL Server. El paquete de proveedor de SQL Server está incluido en el metapaquete Microsoft.AspNetCore.App.The SQL Server provider package is included in the Microsoft.AspnetCore.App metapackage.

Utilización de técnicas de ingeniería inversa para el modeloReverse engineer your model

Ya es momento de crear el modelo de EF en función de la base de datos existente.Now it's time to create the EF model based on your existing database.

  • Herramientas –> Administrador de paquetes NuGet –> Consola del Administrador de paquetesTools –> NuGet Package Manager –> Package Manager Console
  • Ejecute el comando siguiente para crear un modelo a partir de la base de datos 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

Si recibe un error que indica The term 'Scaffold-DbContext' is not recognized as the name of a cmdlet, cierre Visual Studio y vuelva a abrirlo.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.

Sugerencia

Para especificar las tablas para las cuales desea generar entidades, agregue el argumento -Tables al comando anterior.You can specify which tables you want to generate entities for by adding the -Tables argument to the command above. Por ejemplo: -Tables Blog,Post.For example, -Tables Blog,Post.

El proceso de ingeniería inversa creó clases de entidad (Blog.cs & Post.cs) y un contexto derivado (BloggingContext.cs) en función del esquema de la base de datos 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.

Las clases de entidad son simples objetos de C# que representan los datos que va a consultar y guardar.The entity classes are simple C# objects that represent the data you will be querying and saving. Estas son las clases de entidad Blog y 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; }
    }
}

Sugerencia

Para habilitar la carga diferida, puede usar las propiedades de navegación virtual (Blog.Post y Post.Blog).To enable lazy loading, you can make navigation properties virtual (Blog.Post and Post.Blog).

El contexto representa una sesión con la base de datos y le permite consultar y guardar instancias de las clases de entidad.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);
       });
   }
}

Registro del contenido con inserción de dependenciasRegister your context with dependency injection

El concepto de la inserción de dependencias es fundamental para ASP.NET Core.The concept of dependency injection is central to ASP.NET Core. Los servicios (como BloggingContext) se registran con inserción de dependencias durante el inicio de la aplicación.Services (such as BloggingContext) are registered with dependency injection during application startup. Luego se proporcionan estos servicios a los componentes que los necesitan (como los controladores MVC) a través de propiedades o parámetros de constructor.Components that require these services (such as your MVC controllers) are then provided these services via constructor parameters or properties. Para más información sobre la inserción de dependencias, consulte el artículo sobre la inserción de dependencias en el sitio de ASP.NET.For more information on dependency injection see the Dependency Injection article on the ASP.NET site.

Registro y configuración del contexto en Startup.csRegister and configure your context in Startup.cs

Para que BloggingContext esté disponible para los controladores MVC, debe registrarlo como servicio.To make BloggingContext available to MVC controllers, register it as a service.

  • Abra Startup.csOpen Startup.cs
  • Agregue las instrucciones using siguientes en el comienzo del archivoAdd the following using statements at the start of the file
using EFGetStarted.AspNetCore.ExistingDb.Models;
using Microsoft.EntityFrameworkCore;

Ahora puede usar el método AddDbContext(...) para registrarlo como servicio.Now you can use the AddDbContext(...) method to register it as a service.

  • Ubique el método ConfigureServices(...)Locate the ConfigureServices(...) method
  • Agregue el código siguiente resaltado para registrar el contexto como servicio.Add 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));
}

Sugerencia

En una aplicación real, lo habitual sería colocar la cadena de conexión en un archivo de configuración o una variable de entorno.In a real application you would typically put the connection string in a configuration file or environment variable. Por simplicidad, en este tutorial se define en código.For the sake of simplicity, this tutorial has you define it in code. Para más información, consulte Cadenas de conexión.For more information, see Connection Strings.

Crear un controlador y vistasCreate a controller and views

  • Haga clic con el botón derecho en la carpeta Controladores del Explorador de soluciones y seleccione Agregar -> Controlador...Right-click on the Controllers folder in Solution Explorer and select Add -> Controller...
  • Seleccione Controlador de MVC con vistas que usan Entity Framework y haga clic en AceptarSelect MVC Controller with views, using Entity Framework and click Ok
  • Establezca la clase de modelo en Blog y Clase de contexto de datos en BloggingContextSet Model class to Blog and Data context class to BloggingContext
  • Haga clic en AgregarClick Add

Ejecutar la aplicaciónRun the application

Ahora puede ejecutar la aplicación para verla en acción.You can now run the application to see it in action.

  • Depurar -> Iniciar sin depuraciónDebug -> Start Without Debugging

  • La aplicación se compila y se abre en un explorador web.The application builds and opens in a web browser

  • Navegue a /Blogs.Navigate to /Blogs

  • Haga clic en Crear nuevoClick Create New

  • Escriba una dirección URL para el blog nuevo y haga clic en CrearEnter a Url for the new blog and click Create

    Página Crear

    Página de índice

Pasos siguientesNext steps

Para obtener más información sobre cómo aplicar scaffolding a un contexto y a clases de entidad, vea los siguientes artículos:For more information about how to scaffold a context and entity classes, see the following articles: