Penyedia Entity Framework 6 untuk SQL Server yang menggunakan Microsoft.Data.SqlClient

Penyedia Entity Framework 6 ini adalah penyedia pengganti untuk penyedia SQL Server bawaan.

Penyedia ini bergantung pada penyedia ADO.NET Microsoft.Data.SqlClient modern, yang mencakup keuntungan berikut daripada driver yang saat ini digunakan:

  • Klien saat ini menerima dukungan penuh berbeda dengan System.Data.SqlClient, yang berada dalam mode pemeliharaan
  • Mendukung fitur SQL Server baru, termasuk dukungan untuk protokol klien yang ditingkatkan SQL Server 2022 (TDS8)
  • Mendukung sebagian besar metode autentikasi Azure Active Directory
  • Mendukung Always Encrypted dengan .NET

Perhatikan bahwa penyedia ini hanya memperbarui runtime dan tidak akan berfungsi dengan alat Visual Studio yang ada.

Build terbaru dari paket ini tersedia dari NuGet

Konfigurasi

Ada berbagai cara untuk mengonfigurasi Kerangka Kerja Entitas untuk menggunakan penyedia ini.

Anda dapat mendaftarkan penyedia dalam kode menggunakan atribut:

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

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

Jika Anda memiliki beberapa kelas yang mewarisi dari DbContext dalam solusi Anda, tambahkan atribut DbConfigurationType ke semuanya.

Atau Anda dapat menggunakan metode SetConfiguration sebelum panggilan akses data apa pun:

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

Atau tambahkan baris berikut ke kelas DbConfiguration turunan yang ada:

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

Anda juga dapat menggunakan konfigurasi berbasis 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>

Jika Anda menggunakan App.Config dengan aplikasi .NET 6 atau yang lebih baru, Anda harus menghapus <system.data> bagian di atas dan mendaftarkan DbProviderFactory dalam kode sekali:

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

Penggunaan EDMX

Jika Anda menggunakan file EDMX, perbarui nama Provider tersebut.

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

Untuk menggunakan file EDMX dengan perancang Visual Studio, Anda harus mengalihkan nama penyedia kembali ke System.Data.SqlClient

Perbarui juga nama penyedia di dalam string koneksi 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" 
 />

Perubahan kode

Untuk menggunakan penyedia dalam solusi yang ada, diperlukan beberapa perubahan kode (sesuai kebutuhan).

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

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

Kelas berikut telah diganti namanya untuk menghindari konflik dengan kelas yang digunakan System.Data.SqlClient di penyedia SQL Server yang ada:

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Masalah umum

Azure App Service dengan konfigurasi string koneksi dan .NET Framework

Jika Anda menggunakan Azure App Service dengan .NET Framework dan fitur konfigurasi string koneksi s, Anda dapat mengalami masalah runtime, karena ProviderName pengaturan string koneksi dalam skenario ini dikodekan secara permanen ke System.Data.SqlClient.

Solusinya adalah menggunakan kelas MicrosoftSqlDbConfiguration turunan seperti ini:

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

Kemudian gunakan kelas turunan ini dalam konfigurasi berbasis kode yang dijelaskan di atas.

EntityFramework.dll diinstal di GAC

Jika versi lama EntityFramework.dll diinstal di .NET Framework GAC (Global Assembly Cache), Anda mungkin mendapatkan kesalahan ini:

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

Solusinya adalah menghapus .dll dari GAC. Rakitan EF6 tidak boleh diinstal di GAC.