Compartir a través de


Proveedor de SQL Server de Entity Framework 6 basado en Microsoft.Data.SqlClient

Este proveedor de Entity Framework 6 es un proveedor de reemplazo para el proveedor integrado de SQL Server.

Este proveedor depende del proveedor de ADO.NET Microsoft.Data.SqlClient moderno, que incluye las siguientes ventajas sobre el controlador usado actualmente:

  • El cliente actual recibe compatibilidad completa en contraste con System.Data.SqlClient, que está en modo de mantenimiento
  • Es compatible con nuevas funciones de SQL Server, incluida la compatibilidad con el protocolo de cliente mejorado de SQL Server 2022 (TDS8)
  • Admite la mayoría de los métodos de autenticación de Azure Active Directory
  • Admite Always Encrypted con .NET

Tenga en cuenta que este proveedor es una actualización solo de runtime y no funcionará con las herramientas de Visual Studio existentes.

La compilación más reciente de este paquete está disponible en NuGet.

Configuración

Hay varias maneras de configurar Entity Framework para usar este proveedor.

Puede registrar el proveedor en el código mediante un atributo:

[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))]
public class SchoolContext : DbContext
{
    public SchoolContext() : base()
    {
    }

    public DbSet<Student> Students { get; set; }
}

Si tiene varias clases heredadas de DbContext en la solución, agregue el atributo DbConfigurationType a todas ellas.

O bien, puede usar el método SetConfiguration antes de las llamadas de acceso a datos:

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

O agregue las líneas siguientes a la clase DbConfiguration derivada existente:

SetProviderFactory(MicrosoftSqlProviderServices.ProviderInvariantName, Microsoft.Data.SqlClient.SqlClientFactory.Instance);
SetProviderServices(MicrosoftSqlProviderServices.ProviderInvariantName, MicrosoftSqlProviderServices.Instance);
// Optional
SetExecutionStrategy(MicrosoftSqlProviderServices.ProviderInvariantName, () => new MicrosoftSqlAzureExecutionStrategy());

También puede usar la configuración basada en App.Config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />    
    </configSections>
    <entityFramework>
        <providers>
            <provider invariantName="Microsoft.Data.SqlClient" type="System.Data.Entity.SqlServer.MicrosoftSqlProviderServices, Microsoft.EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
    <system.data>
        <DbProviderFactories>
           <add name="SqlClient Data Provider"
             invariant="Microsoft.Data.SqlClient"
             description=".NET Framework Data Provider for SqlServer"
             type="Microsoft.Data.SqlClient.SqlClientFactory, Microsoft.Data.SqlClient" />
        </DbProviderFactories>
    </system.data>
</configuration>

Si usa App.Config con una aplicación de .NET 6 o posterior, debe quitar la sección <system.data> anterior y registrar DbProviderFactory en el código una vez:

DbProviderFactories.RegisterFactory(MicrosoftSqlProviderServices.ProviderInvariantName, Microsoft.Data.SqlClient.SqlClientFactory.Instance);

Uso de EDMX

Si usa un archivo EDMX, actualice el nombre Provider:

<edmx:Edmx Version="3.0" xmlns:edmx="http://schemas.microsoft.com/ado/2009/11/edmx">
  <edmx:Runtime>
    <edmx:StorageModels>
      <Schema Namespace="ChinookModel.Store" Provider="Microsoft.Data.SqlClient" >

Para usar el archivo EDMX con el diseñador de Visual Studio, debe volver a cambiar el nombre del proveedor a System.Data.SqlClient.

Actualice también el nombre del proveedor dentro de la cadena de conexión EntityConnection: provider=Microsoft.Data.SqlClient

 <add 
    name="Database" 
    connectionString="metadata=res://*/EFModels.csdl|res://*/EFModels.ssdl|res://*/EFModels.msl;provider=Microsoft.Data.SqlClient;provider connection string=&quot;data source=server;initial catalog=mydb;integrated security=True;persist security info=True;" 
    providerName="System.Data.EntityClient" 
 />

Cambios en el código

Para usar el proveedor en una solución existente, se requieren algunos cambios de código (según sea necesario).

using System.Data.SqlClient; =>using Microsoft.Data.SqlClient;

using Microsoft.SqlServer.Server; =>using Microsoft.Data.SqlClient.Server;

Se ha cambiado el nombre de las siguientes clases para evitar conflictos con las clases que usan System.Data.SqlClient en el proveedor de SQL Server existente:

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Problemas conocidos

Azure App Service con .NET Framework y la configuración de cadenas de conexión

Si usa Azure App Service con .NET Framework y la característica de configuración de cadenas de conexión, puede encontrar problemas de runtime, ya que la configuración de la cadena de conexión ProviderName en este escenario está codificada de forma rígida en System.Data.SqlClient.

La solución consiste en usar una clase MicrosoftSqlDbConfiguration derivada como esta:

public class AppServiceConfiguration : MicrosoftSqlDbConfiguration
{
    public AppServiceConfiguration()
    {
        SetProviderFactory("System.Data.SqlClient", Microsoft.Data.SqlClient.SqlClientFactory.Instance);
        SetProviderServices("System.Data.SqlClient", MicrosoftSqlProviderServices.Instance);
        SetExecutionStrategy("System.Data.SqlClient", () => new MicrosoftSqlAzureExecutionStrategy());
    }
}

A continuación, use esta clase derivada en la configuración basada en código descrita anteriormente.

EntityFramework.dll instalado en GAC

Si se instala una versión anterior de EntityFramework.dll en la GAC (caché global de ensamblados) de .NET Framework, es posible que reciba este error:

The 'PrimitiveTypeKind' attribute is invalid - The value 'HierarchyId' is invalid according to its datatype

La solución consiste en quitar el .dll de la GAC. Los ensamblados de EF6 nunca deben instalarse en la GAC.