Поделиться через


Поставщик Entity Framework 6 SQL Server на основе Microsoft.Data.SqlClient

Этот поставщик Entity Framework 6 является поставщиком замены для встроенного поставщика SQL Server.

Этот поставщик зависит от современного поставщика microsoft.Data.SqlClient ADO.NET, который включает следующие преимущества по сравнению с текущим используемым драйвером:

  • Текущий клиент, получающий полную поддержку в отличие от System.Data.SqlClientтого, что находится в режиме обслуживания
  • Поддерживает новые функции SQL Server, включая поддержку расширенного клиентского протокола SQL Server 2022 (TDS8)
  • Поддерживает большинство методов проверки подлинности Azure Active Directory
  • Поддерживает Always Encrypted с помощью .NET

Обратите внимание, что этот поставщик является только обновлением среды выполнения и не будет работать с существующими инструментами Visual Studio.

Последняя сборка этого пакета доступна в NuGet

Настройка

Существует несколько способов настройки Entity Framework для использования этого поставщика.

Вы можете зарегистрировать поставщика в коде с помощью атрибута:

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

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

Если в решении есть несколько классов, наследуемых от DbContext, добавьте атрибут DbConfigurationType ко всем из них.

Или можно использовать метод SetConfiguration перед вызовами доступа к данным:

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

Или добавьте следующие строки в существующий производный класс DbConfiguration:

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

Можно также использовать конфигурацию на основе 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>

Если вы используете App.Config с приложением .NET 6 или более поздней версии, необходимо удалить <system.data> приведенный выше раздел и зарегистрировать DbProviderFactory в коде один раз:

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

Использование EDMX

Если вы используете EDMX-файл, обновите 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" >

Чтобы использовать EDMX-файл с конструктором Visual Studio, необходимо переключить имя поставщика обратно в System.Data.SqlClient

Также обновите имя поставщика в строка подключения 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" 
 />

Изменения в коде

Чтобы использовать поставщик в существующем решении, необходимо несколько изменений кода (по мере необходимости).

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

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

Следующие классы были переименованы, чтобы избежать конфликтов с классами, которые используются System.Data.SqlClient в существующем поставщике SQL Server:

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Известные проблемы

Служба приложение Azure с конфигурацией платформа .NET Framework и строка подключения

Если вы используете службу приложение Azure с платформа .NET Framework и функцией конфигурации строка подключения, вы можете столкнуться с проблемами среды выполнения, так как ProviderName параметр строка подключения в этом сценарии жестко закодированSystem.Data.SqlClient.

Решение — использовать производный класс MicrosoftSqlDbConfiguration следующим образом:

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

Затем используйте этот производный класс в конфигурации на основе кода, описанной выше.

EntityFramework.dll, установленный в GAC

Если в платформа .NET Framework GAC (глобальный кэш сборок) установлена более ранняя версия EntityFramework.dll, может появиться следующая ошибка:

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

Решение — удалить .dll из GAC. Сборки EF6 никогда не должны устанавливаться в GAC.