ASP.NET Core y Entity Framework 6
Nota:
Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión .NET 8 de este artículo.
Importante
Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.
Para la versión actual, consulte la versión .NET 8 de este artículo.
Por Patrick Goode
Uso de Entity Framework 6 con ASP.NET Core
Entity Framework Core se debe usar para desarrollos nuevo. En el ejemplo de descarga se usa Entity Framework 6 (EF6), que se puede utilizar para migrar aplicaciones existentes a ASP.NET Core.
Recursos adicionales
- Entity Framework - Code-Based Configuration (Entity Framework: configuración basada en código)
Por Paweł Grudzień y Damien Pontifex
En este artículo se muestra cómo usar Entity Framework 6 en una aplicación ASP.NET Core.
Información general
Para usar Entity Framework 6, el proyecto se tiene que compilar con .NET Framework, dado que Entity Framework 6 no es compatible con .NET Core. Si necesita usar características multiplataforma, debe actualizar a Entity Framework Core.
La manera recomendada de usar Entity Framework 6 en una aplicación ASP.NET Core es colocar el contexto y las clases de modelo de EF6 en un proyecto de biblioteca de clases cuyo destino sea .NET Framework. Agregue una referencia a la biblioteca de clases desde el proyecto de ASP.NET Core. Vea el ejemplo Visual Studio solution with EF6 and ASP.NET Core projects (Solución de Visual Studio con proyectos de EF6 y ASP.NET Core).
No se puede colocar un contexto de EF6 en un proyecto de ASP.NET Core porque los proyectos de .NET Core no admiten toda la funcionalidad que requieren los comandos de EF6 como Enable-Migrations.
Independientemente del tipo de proyecto en el que localice el contexto de EF6, solo las herramientas de línea de comandos de EF6 funcionan con un contexto de EF6. Por ejemplo, Scaffold-DbContext
solo está disponible en Entity Framework Core. Si necesita la utilización de técnicas de ingeniería inversa para una base de datos en un modelo de EF6, vea Code First to an Existing Database (Code First para una base de datos existente).
Marco de referencia completo y EF6 en el proyecto de ASP.NET Core
El proyecto de ASP.NET Core debe destinarse a .NET Framework y hacer referencia a EF6. Por ejemplo, el archivo .csproj
del proyecto ASP.NET Core tendrá un aspecto similar al ejemplo siguiente (solo se muestran las partes relevantes del archivo).
<PropertyGroup>
<TargetFramework>net452</TargetFramework>
<PreserveCompilationContext>true</PreserveCompilationContext>
<AssemblyName>MVCCore</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>MVCCore</PackageId>
</PropertyGroup>
Al crear un proyecto, use la plantilla Aplicación web ASP.NET Core (.NET Framework) .
Controlar las cadenas de conexión
Las herramientas de línea de comandos de EF6 que se van a usar en el proyecto de biblioteca de clases de EF6 requieren un constructor predeterminado para poder crear instancias del contexto. Pero, probablemente querrá especificar la cadena de conexión que se va a usar en el proyecto de ASP.NET Core, en cuyo caso el constructor de contexto debe tener un parámetro que permita pasar la cadena de conexión. Este es un ejemplo.
public class SchoolContext : DbContext
{
public SchoolContext(string connString) : base(connString)
{
}
Como el contexto de EF6 no tiene un constructor sin parámetros, el proyecto de EF6 tiene que proporcionar una implementación de IDbContextFactory<TContext>. Las herramientas de línea de comandos de EF6 buscarán y usarán esa implementación para poder crear instancias del contexto. Este es un ejemplo.
public class SchoolContextFactory : IDbContextFactory<SchoolContext>
{
public SchoolContext Create()
{
return new EF6.SchoolContext("Server=(localdb)\\mssqllocaldb;Database=EF6MVCCore;Trusted_Connection=True;MultipleActiveResultSets=true");
}
}
En este ejemplo de código, la implementación de IDbContextFactory
pasa una cadena de conexión codificada de forma rígida. Se trata de la cadena de conexión que van a usar las herramientas de línea de comandos. Querrá implementar una estrategia para asegurarse de que la biblioteca de clases usa la misma cadena de conexión que la aplicación que realiza la llamada. Por ejemplo, podría obtener el valor de una variable de entorno en los dos proyectos.
Configurar la inserción de dependencias en el proyecto de ASP.NET Core
En el archivo Startup.cs
del proyecto de Core, establezca el contexto de EF6 para la inserción de dependencias (DI) en ConfigureServices
. La duración de cada solicitud se debe configurar como ámbito de los objetos de contexto de EF.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddScoped<SchoolContext>(_ => new SchoolContext(Configuration.GetConnectionString("DefaultConnection")));
}
Después, puede obtener una instancia del contexto en los controladores mediante DI. El código es similar al que escribiría para un contexto de EF Core:
public class StudentsController : Controller
{
private readonly SchoolContext _context;
public StudentsController(SchoolContext context)
{
_context = context;
}
Aplicación de ejemplo
Para obtener una aplicación de ejemplo funcional, vea la solución de Visual Studio de ejemplo que se incluye en este artículo.
Este ejemplo se puede crear desde cero mediante los pasos siguientes en Visual Studio:
Cree una solución.
Agregar>Nuevo proyecto>Web>Aplicación web de ASP.NET Core
- En el cuadro de diálogo de selección de la plantilla de proyecto, seleccione la API y .NET Framework en la lista desplegable.
Agregar>Nuevo proyecto>Escritorio de Windows>Biblioteca de clases (.NET Framework)
En la Consola del Administrador de paquetes (PMC) para ambos proyectos, ejecute el comando
Install-Package Entityframework
.En el proyecto de biblioteca de clases, cree clases de modelo de datos, una clase de contexto y una implementación de
IDbContextFactory
.En PMC para el proyecto de biblioteca de clases, ejecute los comandos
Enable-Migrations
yAdd-Migration Initial
. Si ha configurado el proyecto de ASP.NET Core como proyecto de inicio, agregue-StartupProjectName EF6
a estos comandos.En el proyecto de Core, agregue una referencia de proyecto al proyecto de biblioteca de clases.
En el proyecto de Core, en
Startup.cs
, registre el contexto para DI.En el proyecto de Core, en
appsettings.json
, agregue la cadena de conexión.En el proyecto de Core, agregue un controlador y vistas para comprobar que puede leer y escribir datos. (Tenga en cuenta que el scaffolding de ASP.NET Core MVC no funcionará con el contexto de EF6 al que se hace referencia desde la biblioteca de clases).
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de