c# - first - Cómo usar Entity Framework 6.x en Asp.Net 5(MVC 6)
entity framework tutorial español (5)
Estoy probando el nuevo Asp.Net 5, usando VS 2015 CTP-6. Debido a la falta de funciones en Entity Framework 7, preferiría usar EF6 por ahora.
He intentado eliminar EF7 y luego aplicar EF6 en PM, como esto:
Uninstall-Package EntityFramework
Install-Package EntityFramework -version 6.1.3
No se devolvieron errores y el archivo project.json parece actualizado en consecuencia. Aunque, no hay DbContext disponible.
¿Es esto posible? Si es así, ¿cómo debo proceder desde aquí? ¿Necesito web.config para compatibilidad con EF6?
¿No puedes simplemente hacer esto en el archivo startup.cs? Guardar creando una fábrica
// new context on each request
services.AddScoped<IMyContext, MyContext>((s) =>
{
return new MyContext(Configuration["Data:MyConnection:ConnectionString"]);
});
Antes de comenzar, asegúrese de compilar con .NET Framework completo en su project.json
ya que Entity Framework 6 no admite .NET Core. Si necesita funciones multiplataforma, deberá actualizar a Entity Framework Core.
En su archivo project.json, especifique un solo destino para el completo .NET Framework:
"frameworks": {
"net46": {}
}
y luego configurar las cadenas de conexión y la inyección de dependencia
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
}
En la clase de inicio dentro de ConfigureServices, agregue el método de fábrica de su contexto con su cadena de conexión. El contexto debe resolverse una vez por alcance para garantizar el rendimiento y garantizar el funcionamiento confiable de Entity Framework.
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped((_) => new ApplicationDbContext(Configuration["Data:DefaultConnection:ConnectionString"]));
// Configure remaining services
}
ntity Framework 6 permite que la configuración se especifique en xml (en web.config o app.config) o mediante código. A partir de ASP.NET Core, toda la configuración está basada en código.
La configuración basada en código se logra creando una subclase de System.Data.Entity.Config.DbConfiguration
y aplicando System.Data.Entity.DbConfigurationTypeAttribute
a su subclase DbContext .
Nuestro archivo de configuración típicamente se veía así:
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
El elemento defaultConnectionFactory establece la fábrica para las conexiones. Si este atributo no está establecido, el valor predeterminado es SqlConnectionProvider . Si, por otro lado, se proporciona un valor, la clase dada se usará para crear DbConnection con su método CreateConnection . Si la fábrica dada no tiene un constructor predeterminado, debe agregar los parámetros que se usan para construir el objeto
[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration
public class ApplicationDbContext : DbContext
{
[...]
}
public class CodeConfig : DbConfiguration
{
public CodeConfig()
{
SetProviderServices("System.Data.SqlClient",
System.Data.Entity.SqlServer.SqlProviderServices.Instance);
}
}
Este artículo le mostrará cómo usar Entity Framework 6 dentro de una aplicación Core de ASP.NET. https://docs.asp.net/en/latest/data/entity-framework-6.html
Con la versión RC, esto se convierte en:
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();
var Configuration = builder.Build();
var connectionString = Configuration["Data:DefaultConnection:ConnectionString"];
Dependiendo de la base de datos utilizada, puede que no sea tan fácil como la respuesta. Si está utilizando MsSql, no se necesita ninguna configuración y la respuesta aceptada es perfectamente correcta. Pero el uso de LocalDB
puede necesitar alguna configuración.
Por ejemplo MySql
necesita registrarse proveedor
[DbConfigurationType(typeof(CodeConfig))] // point to the class that inherit from DbConfiguration
public class ApplicationDbContext : DbContext
{
[...]
}
public class CodeConfig : DbConfiguration
{
public CodeConfig()
{
SetDefaultConnectionFactory(new MySql.Data.Entity.MySqlConnectionFactory());
SetProviderServices("MySql.Data.MySqlClient",
new MySql.Data.MySqlClient.MySqlProviderServices());
}
}
PostgreSql
necesita registrar el proveedor en la sección entityFramework AND system.data. Esto se puede hacer usando el evento System.Data.Entity.DbConfiguration.Loaded
. Lo mismo ocurre con Oracle
.
Consulte esta publicación del blog que lo explica en detalle: http://bleedingnedge.com/2015/11/01/entity-framework-6-with-asp-net-5/
Sí, esto funciona bien.
Debe configurar manualmente la cadena de conexión al crear el contexto, ya que no puede obtenerlo desde web.config
para que puedas hacer esto
public class MyContext : DbContext {
public MyContext(string connectionString) : base(connectionString) {
}
}
var context = new MyContext("myConnectionString");
Si desea obtener la cadena de conexión desde config.json, intente esto
IConfiguration configuration = new Configuration().AddJsonFile("config.json");
var connectionString = configuration["Data:DefaultConnection:ConnectionString"]);
y si desea inyectar el contexto en el contenedor DI, entonces agregué una fábrica como esta
public static class MyContextFactory
{
public static MyContext GetContext() {
IConfiguration configuration = new Configuration().AddJsonFile("config.json");
return new MyContext(configuration["Data:DefaultConnection:ConnectionString"]);
}
}
y luego agregó esto en startup.cs
services.AddTransient<MyContext>((a) => MyContextFactory.GetContext());