Sdílet prostřednictvím


Zprostředkovatel Sql Serveru Entity Framework 6 založený na Microsoft.Data.SqlClient

Tento zprostředkovatel Entity Framework 6 je náhradním zprostředkovatelem předdefinovaného zprostředkovatele SQL Serveru.

Tento poskytovatel závisí na moderním poskytovateli Microsoft.Data.SqlClient ADO.NET, který zahrnuje následující výhody oproti aktuálně používanému ovladači:

  • Aktuální klient přijímá plnou podporu na rozdíl od System.Data.SqlClientrežimu údržby.
  • Podporuje nové funkce SQL Serveru, včetně podpory rozšířeného klientského protokolu SQL Serveru 2022 (TDS8).
  • Podporuje většinu metod ověřování Azure Active Directory.
  • Podporuje funkci Always Encrypted s .NET.

Všimněte si, že tento poskytovatel je pouze aktualizace modulu runtime a nebude fungovat s existujícími nástroji sady Visual Studio.

Nejnovější build tohoto balíčku je k dispozici v NuGetu.

Konfigurace

Existují různé způsoby konfigurace Entity Framework pro použití tohoto poskytovatele.

Poskytovatele můžete zaregistrovat v kódu pomocí atributu:

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

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

Pokud máte ve svém řešení více tříd dědění z DbContext, přidejte do všech z nich atribut DbConfigurationType.

Nebo můžete použít metodu SetConfiguration před všemi voláními přístupu k datům:

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

Nebo do existující odvozené třídy DbConfiguration přidejte následující řádky:

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

Můžete také použít konfiguraci založenou na 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>

Pokud používáte App.Config s aplikací .NET 6 nebo novější, musíte výše uvedený oddíl odebrat <system.data> a zaregistrovat DbProviderFactory v kódu jednou:

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

Využití EDMX

Pokud používáte soubor EDMX, aktualizujte Provider název:

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

Chcete-li použít soubor EDMX s návrhářem sady Visual Studio, musíte přepnout název zprostředkovatele zpět na System.Data.SqlClient

Aktualizujte také název zprostředkovatele uvnitř připojovací řetězec 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" 
 />

Změny kódu

Pokud chcete poskytovatele použít v existujícím řešení, vyžaduje se několik změn kódu (podle potřeby).

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

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

Následující třídy byly přejmenovány, aby nedocházelo ke konfliktům s třídami, které používají System.Data.SqlClient v existujícím poskytovateli SQL Serveru:

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Známé problémy

služba Aplikace Azure s konfigurací rozhraní .NET Framework a připojovací řetězec s

Pokud používáte službu Aplikace Azure s rozhraním .NET Framework a funkcí konfigurace připojovací řetězec s, můžete narazit na problémy s modulem runtime, protože ProviderName nastavení připojovací řetězec v tomto scénáři je pevně zakódované System.Data.SqlClient.

Řešením je použít odvozenou třídu MicrosoftSqlDbConfiguration, jako je tato:

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

Pak tuto odvozenou třídu použijte v konfiguraci založené na kódu popsané výše.

EntityFramework.dll nainstalované v GAC

Pokud je ve službě GAC rozhraní .NET Framework (Global Assembly Cache) nainstalovaná starší verze EntityFramework.dll, může se zobrazit tato chyba:

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

Řešením je odebrat .dll z GAC. Sestavení EF6 by nikdy neměla být nainstalována v GAC.