Teilen über


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=&quot;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.