Udostępnij za pośrednictwem


Dostawca programu Entity Framework 6 SQL Server oparty na microsoft.Data.SqlClient

Ten dostawca programu Entity Framework 6 jest dostawcą zastępczym wbudowanego dostawcy programu SQL Server.

Ten dostawca zależy od nowoczesnego dostawcy ADO.NET Microsoft.Data.SqlClient , który oferuje następujące korzyści wynikające z aktualnie używanego sterownika:

  • Bieżący klient otrzymuje pełną obsługę w przeciwieństwie do System.Data.SqlClientprogramu , który jest w trybie konserwacji
  • Obsługuje nowe funkcje programu SQL Server, w tym obsługę rozszerzonego protokołu klienta programu SQL Server 2022 (TDS8)
  • Obsługuje większość metod uwierzytelniania usługi Azure Active Directory
  • Obsługuje funkcję Always Encrypted przy użyciu platformy .NET

Zwróć uwagę, że ten dostawca jest tylko aktualizacją środowiska uruchomieniowego i nie będzie działać z istniejącymi narzędziami programu Visual Studio.

Najnowsza kompilacja tego pakietu jest dostępna z pakietu NuGet

Konfigurowanie

Istnieją różne sposoby konfigurowania programu Entity Framework do korzystania z tego dostawcy.

Dostawcę można zarejestrować w kodzie przy użyciu atrybutu:

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

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

Jeśli w rozwiązaniu istnieje wiele klas dziedziczynych z obiektu DbContext, dodaj atrybut DbConfigurationType do wszystkich z nich.

Możesz też użyć metody SetConfiguration przed wywołaniami dostępu do danych:

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

Możesz też dodać następujące wiersze do istniejącej pochodnej klasy DbConfiguration:

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

Możesz również użyć konfiguracji opartej na pliku 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>

Jeśli używasz aplikacji App.Config z aplikacją .NET 6 lub nowszą, musisz usunąć sekcję <system.data> powyżej i zarejestrować element DbProviderFactory w kodzie raz:

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

Użycie EDMX

Jeśli używasz pliku EDMX, zaktualizuj Provider nazwę:

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

Aby używać pliku EDMX z projektantem programu Visual Studio, należy przełączyć nazwę dostawcy z powrotem na System.Data.SqlClient

Zaktualizuj również nazwę dostawcy w parametry połączenia 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" 
 />

Zmiany kodu

Aby użyć dostawcy w istniejącym rozwiązaniu, wymagane jest kilka zmian kodu (w razie potrzeby).

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

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

Zmieniono nazwy następujących klas, aby uniknąć konfliktów z klasami używanymi System.Data.SqlClient w istniejącym dostawcy programu SQL Server:

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Znane problemy

usługa aplikacja systemu Azure z programem .NET Framework i konfiguracją parametry połączenia

Jeśli używasz usługi aplikacja systemu Azure z programem .NET Framework i funkcją konfiguracji parametry połączenia s, możesz napotkać problemy ze środowiskiem uruchomieniowym, ponieważ ProviderName ustawienie parametry połączenia w tym scenariuszu jest zakodowane na stałe na .System.Data.SqlClient

Rozwiązaniem jest użycie pochodnej klasy MicrosoftSqlDbConfiguration w następujący sposób:

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

Następnie użyj tej klasy pochodnej w konfiguracji opartej na kodzie opisanej powyżej.

EntityFramework.dll zainstalowane w usłudze GAC

Jeśli starsza wersja EntityFramework.dll jest zainstalowana w GAC programu .NET Framework GAC (globalna pamięć podręczna zestawów), może wystąpić następujący błąd:

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

Rozwiązaniem jest usunięcie .dll z GAC. Zestawy EF6 nigdy nie powinny być instalowane w GAC.