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="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에 설치하면 안 됩니다.
.NET