Introducción a EF Core en .NET Framework con una base de datos existenteGetting started with EF Core on .NET Framework with an Existing Database

En este tutorial, compilará una aplicación de consola que realiza el acceso a datos básicos en una base de datos de Microsoft SQL Server mediante Entity Framework.In this tutorial, you build a console application that performs basic data access against a Microsoft SQL Server database using Entity Framework. Para crear un modelo de Entity Framework, usará ingeniería inversa en una base de datos existente.You create an Entity Framework model by reverse engineering an existing database.

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

Requisitos previosPrerequisites

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 the 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ú izquierdo, seleccione Instalado > Visual C# > Escritorio de Windows.From the left menu select Installed > Visual C# > Windows Desktop

  • Seleccione la plantilla del proyecto Aplicación de consola (.NET Framework)Select the Console App (.NET Framework) project template

  • Asegúrese de que el proyecto tenga .NET Framework 4.6.1 o posterior como destino.Make sure that the project targets .NET Framework 4.6.1 or later

  • Asigne el nombre ConsoleApp.ExistingDb al proyecto y haga clic en Aceptar.Name the project ConsoleApp.ExistingDb and click OK

Instalación de Entity FrameworkInstall Entity Framework

Para usar EF Core, instale el paquete correspondiente a los proveedores de bases de datos a los que desea dirigirse.To use EF Core, install the package for the database provider(s) you want to target. Este tutorial usa SQL Server.This tutorial uses SQL Server. Para una lista de los proveedores disponibles, consulte Proveedores de bases de datos.For a list of available providers see Database Providers.

  • Herramientas > Administrador de paquetes NuGet > Consola del Administrador de paquetesTools > NuGet Package Manager > Package Manager Console

  • Ejecute Install-Package Microsoft.EntityFrameworkCore.SqlServer.Run Install-Package Microsoft.EntityFrameworkCore.SqlServer

En el paso siguiente, usará parte de Entity Framework Tools para aplicar ingeniería inversa en la base de datos.In the next step, you use some Entity Framework Tools to reverse engineer the database. Por lo tanto, instale el paquete de herramientas.So install the tools package as well.

  • Ejecute Install-Package Microsoft.EntityFrameworkCore.Tools.Run Install-Package Microsoft.EntityFrameworkCore.Tools

Aplicación de ingeniería inversa en el modeloReverse engineer the model

Ahora hay que crear el modelo de EF en función de una base de datos existente.Now it's time to create the EF model based on an 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 existenteRun the following command to create a model from the existing database

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

Sugerencia

Para especificar las tablas para generar entidades, agregue el argumento -Tables al comando anterior.You can specify the tables 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 y Post) y un contexto derivado (BloggingContext) en función del esquema de la base de datos existente.The reverse engineer process created entity classes (Blog and Post) and a derived context (BloggingContext) 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 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; }
    }
}

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.The context represents a session with the database. Tiene métodos que puede usar para consultar y guardar instancias de las clases de entidad.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);
            });
        }
    }
}

Uso del modeloUse the model

Ahora puede usar el modelo para realizar el acceso a los datos.You can now use the model to perform data access.

  • Abra Program.cs.Open Program.cs

  • Reemplace el contenido del archivo por el código siguienteReplace 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);
                    }
                }
            }
        }
    }
    
  • Depurar > Iniciar sin depuraciónDebug > Start Without Debugging

    Verá que un blog se guarda en la base de datos y, luego, los detalles de todos los blogs se imprimen en la consola.You see that one blog is saved to the database and then the details of all blogs are printed to the console.

    imagen

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: