다음을 통해 공유


Microsoft.Data.SqlClient 기반의 Entity Framework 6 SQL Server 공급자

이 Entity Framework 6 공급자는 기본 제공 SQL Server 공급자의 대체 공급자입니다.

이 공급자는 현재 사용되는 드라이버에 비해 다음과 같은 이점을 포함하는 최신 Microsoft.Data.SqlClient ADO.NET 공급자에 따라 다릅니다.

  • 유지 관리 모드에 있는 System.Data.SqlClient와 달리 현재 클라이언트가 전체 지원을 받고 있음
  • SQL Server 2022 TDS8(고급 클라이언트 프로토콜) 지원을 포함하여 새로운 SQL Server 기능을 지원합니다.
  • 대부분의 Azure Active Directory 인증 방법 지원
  • .NET을 사용한 Always Encrypted 지원

이 공급자는 런타임 전용 업데이트이며 기존 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>

.NET 6 이상 앱과 함께 App.Config를 사용하는 경우 위의 <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" >

Visual Studio 디자이너에서 EDMX 파일을 사용하려면 공급자 이름을 다시 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;

기존 SQL Server 공급자에서 System.Data.SqlClient를 사용하는 클래스와의 충돌을 피하기 위해 다음 클래스의 이름이 바뀌었습니다.

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

알려진 문제

.NET Framework 및 연결 문자열 구성을 사용한 Azure App Service

.NET Framework 및 연결 문자열 구성 기능과 함께 Azure App Service를 사용하는 경우 이 시나리오의 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());
    }
}

그런 다음 위에서 설명한 코드 기반 구성에서 이 파생 클래스를 사용합니다.

GAC에 설치된 EntityFramework.dll

.NET Framework GAC(전역 어셈블리 캐시)에 이전 버전의 EntityFramework.dll이 설치된 경우 다음 오류가 발생할 수 있습니다.

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

해결 방법은 GAC에서 .dll을 제거하는 것입니다. EF6 어셈블리는 GAC에 설치하면 안 됩니다.