Partager via


Fournisseur Entity Framework 6 SQL Server basé sur Microsoft.Data.SqlClient

Ce fournisseur Entity Framework 6 est un fournisseur de remplacement pour le fournisseur SQL Server intégré.

Ce fournisseur dépend du fournisseur moderne Microsoft.Data.SqlClient ADO.NET, qui inclut les avantages suivants sur le pilote actuellement utilisé :

  • Client actuel recevant une prise en charge complète contrairement à System.Data.SqlClient, qui est en mode maintenance
  • Prend en charge les nouvelles fonctionnalités de SQL Server, y compris la prise en charge du protocole client amélioré de SQL Server 2022 (TDS8).
  • Prise en charge de la plupart des méthodes d’authentification Azure Active Directory
  • Prend en charge Always Encrypted avec .NET

Notez que ce fournisseur est une mise à jour du runtime uniquement et ne fonctionne pas avec les outils Visual Studio existants.

La dernière version de ce package est disponible à partir de NuGet

Configuration

Il existe différentes façons de configurer Entity Framework pour utiliser ce fournisseur.

Vous pouvez inscrire le fournisseur dans le code à l’aide d’un attribut :

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

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

Si plusieurs classes héritent de DbContext dans votre solution, ajoutez l’attribut DbConfigurationType à tous ces derniers.

Vous pouvez également utiliser la méthode SetConfiguration avant les appels d’accès aux données :

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

Vous pouvez également ajouter les lignes suivantes à votre classe DbConfiguration dérivée existante :

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

Vous pouvez également utiliser la configuration basée sur 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 vous utilisez App.Config avec une application .NET 6 ou ultérieure, vous devez supprimer la section <system.data> ci-dessus et inscrire DbProviderFactory dans le code une fois :

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

Utilisation d’EDMX

Si vous utilisez un fichier EDMX, mettez à jour le nom 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" >

Pour utiliser le fichier EDMX avec le concepteur Visual Studio, vous devez revenir au nom du fournisseur en System.Data.SqlClient

Mettez également à jour le nom du fournisseur à l’intérieur de la chaîne de connexion 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" 
 />

Modifications du code

Pour utiliser le fournisseur dans une solution existante, quelques modifications de code sont requises (si nécessaire).

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

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

Les classes suivantes ont été renommées pour éviter les conflits avec les classes qui utilisent System.Data.SqlClient dans le fournisseur SQL Server existant :

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Problèmes connus

Azure App Service avec .NET Framework et la configuration des chaînes de connexion

Si vous utilisez Azure App Service avec .NET Framework et la fonctionnalité de configuration des chaînes de connexion, vous pouvez rencontrer des problèmes d’exécution, car le paramètre de chaîne de connexion ProviderName dans ce scénario est codé en dur sur System.Data.SqlClient.

La solution consiste à utiliser une classe MicrosoftSqlDbConfiguration dérivée comme suit :

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());
    }
}

Utilisez ensuite cette classe dérivée dans la configuration basée sur le code décrite ci-dessus.

EntityFramework.dll installé dans le GAC

Si une version antérieure de EntityFramework.dll est installée dans le GAC .NET Framework (Global Assembly Cache), vous pouvez obtenir cette erreur :

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

La solution consiste à supprimer le .dll du GAC. Les assemblys EF6 ne doivent jamais être installés dans le GAC.