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="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.