Entity Framework 6-SQL Server-Anbieter basierend auf Microsoft.Data.SqlClient
Dieser Entity Framework 6-Anbieter ist ein Ersatzanbieter für den integrierten SQL Server-Anbieter.
Dieser Anbieter hängt vom modernen ADO.NET-Anbieter Microsoft.Data.SqlClient ab, der die folgenden Vorteile gegenüber dem aktuell verwendeten Treiber umfasst:
- Der aktuelle Client erhält volle Unterstützung im Gegensatz zu
System.Data.SqlClient
, der sich im Wartungsmodus befindet. - Er unterstützt neue SQL Server-Features, einschließlich des erweiterten Clientprotokolls von SQL Server 2022 (TDS8).
- Er unterstützt die meisten Azure Active Directory-Authentifizierungsmethoden.
- Er unterstützt Always Encrypted mit .NET.
Beachten Sie, dass dieser Anbieter nur ein Runtimeupdate ist und nicht mit den vorhandenen Visual Studio-Tools funktioniert.
Der neueste Build dieses Pakets ist über NuGet verfügbar.
Konfiguration
Es gibt verschiedene Möglichkeiten zum Konfigurieren von Entity Framework für die Verwendung dieses Anbieters.
Sie können den Anbieter im Code mithilfe eines Attributs registrieren:
[DbConfigurationType(typeof(MicrosoftSqlDbConfiguration))]
public class SchoolContext : DbContext
{
public SchoolContext() : base()
{
}
public DbSet<Student> Students { get; set; }
}
Wenn mehrere Klassen in Ihrer Lösung von DbContext erben, fügen Sie allen das DbConfigurationType-Attribut hinzu.
Alternativ können Sie die SetConfiguration-Methode vor Datenzugriffsaufrufen verwenden:
DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());
Oder Sie fügen der vorhandenen abgeleiteten DbConfiguration-Klasse die folgenden Zeilen hinzu:
SetProviderFactory(MicrosoftSqlProviderServices.ProviderInvariantName, Microsoft.Data.SqlClient.SqlClientFactory.Instance);
SetProviderServices(MicrosoftSqlProviderServices.ProviderInvariantName, MicrosoftSqlProviderServices.Instance);
// Optional
SetExecutionStrategy(MicrosoftSqlProviderServices.ProviderInvariantName, () => new MicrosoftSqlAzureExecutionStrategy());
Sie können auch App.Config-basierte Konfigurationen verwenden:
<?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>
Wenn Sie App.Config mit einer App für .NET 6 oder höher verwenden, müssen Sie den Abschnitt <system.data>
oben entfernen und DbProviderFactory einmal im Code registrieren:
DbProviderFactories.RegisterFactory(MicrosoftSqlProviderServices.ProviderInvariantName, Microsoft.Data.SqlClient.SqlClientFactory.Instance);
EDMX-Verwendung
Wenn Sie eine EDMX-Datei verwenden, aktualisieren Sie den Provider
-Namen:
<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" >
Um die EDMX-Datei mit dem Visual Studio-Designer zu verwenden, müssen Sie den Anbieternamen wieder als
System.Data.SqlClient
festlegen.
Aktualisieren Sie außerdem den Anbieternamen innerhalb der EntityConnection-Verbindungszeichenfolge – 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"
/>
Codeänderungen
Um den Anbieter in einer vorhandenen Lösung zu verwenden, sind einige Codeänderungen erforderlich (je nach Bedarf).
using System.Data.SqlClient;
=>using Microsoft.Data.SqlClient;
using Microsoft.SqlServer.Server;
=>using Microsoft.Data.SqlClient.Server;
Die folgenden Klassen wurden umbenannt, um Konflikte mit Klassen zu vermeiden, die System.Data.SqlClient
im vorhandenen SQL Server-Anbieter verwenden:
SqlAzureExecutionStrategy
=>MicrosoftSqlAzureExecutionStrategy
SqlDbConfiguration
=>MicrosoftSqlDbConfiguration
SqlProviderServices
=>MicrosoftSqlProviderServices
SqlServerMigrationSqlGenerator
=>MicrosoftSqlServerMigrationSqlGenerator
SqlSpatialServices
=>MicrosoftSqlSpatialServices
SqlConnectionFactory
=>MicrosoftSqlConnectionFactory
LocalDbConnectionFactory
=>MicrosoftLocalDbConnectionFactory
Bekannte Probleme
Azure App Service mit .NET Framework und Verbindungszeichenfolgenkonfiguration
Wenn Sie Azure App Service mit .NET Framework und dem Verbindungszeichenfolgen-Konfigurationsfeature verwenden, können Laufzeitprobleme auftreten, da die Einstellung ProviderName
für die Verbindungszeichenfolge in diesem Szenario als System.Data.SqlClient
hartcodiert ist.
Die Lösung besteht darin, eine abgeleitete MicrosoftSqlDbConfiguration-Klasse wie folgt zu verwenden:
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());
}
}
Verwenden Sie dann diese abgeleitete Klasse in der oben beschriebenen codebasierten Konfiguration.
EntityFramework.dll in GAC installiert
Wenn eine ältere Version von „EntityFramework.dll“ im .NET Framework-GAC (Global Assembly Cache) installiert ist, wird möglicherweise dieser Fehler angezeigt:
The 'PrimitiveTypeKind' attribute is invalid - The value 'HierarchyId' is invalid according to its datatype
Die Lösung besteht darin, die DLL-Datei aus dem GAC zu entfernen. EF6-Assemblys sollten niemals im GAC installiert werden.