Microsoft.Data.SqlClient tabanlı Entity Framework 6 SQL Server sağlayıcısı

Bu Entity Framework 6 sağlayıcısı, yerleşik SQL Server sağlayıcısının yerine geçen sağlayıcıdır.

Bu sağlayıcı, şu anda kullanılan sürücüye göre aşağıdaki avantajları içeren modern Microsoft.Data.SqlClient ADO.NET sağlayıcısına bağlıdır:

  • Bakım modunda olan System.Data.SqlClient ile karşılaştırıldığında, geçerli istemci tam destek alıyor.
  • SQL Server 2022 gelişmiş istemci protokolü (TDS8) desteği de dahil olmak üzere yeni SQL Server özelliklerini destekler
  • Çoğu Azure Active Directory kimlik doğrulama yöntemini destekler
  • .NET ile Always Encrypted'i destekler

Bu sağlayıcının yalnızca bir çalışma zamanı güncelleştirmesi olduğuna ve mevcut Visual Studio araçlarıyla çalışmayacağını unutmayın.

Bu paketin en son derlemesi NuGet'ten edinilebilir

Yapılandırma

Entity Framework'i bu sağlayıcıyı kullanacak şekilde yapılandırmanın çeşitli yolları vardır.

Sağlayıcıyı bir öznitelik kullanarak koda kaydedebilirsiniz:

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

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

Çözümünüzde DbContext'ten devralan birden çok sınıfınız varsa, hepsine DbConfigurationType özniteliğini ekleyin.

Veya herhangi bir veri erişimi çağrısından önce SetConfiguration yöntemini kullanabilirsiniz:

 DbConfiguration.SetConfiguration(new MicrosoftSqlDbConfiguration());

Veya mevcut türetilmiş DbConfiguration sınıfınıza aşağıdaki satırları ekleyin:

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

App.Config tabanlı yapılandırmayı da kullanabilirsiniz:

<?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'i bir .NET 6 veya üzeri bir uygulamayla kullanıyorsanız yukarıdaki bölümü kaldırmanız <system.data> ve DbProviderFactory dosyasını bir kez koda kaydetmeniz gerekir:

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

EDMX kullanımı

EDMX dosyası kullanıyorsanız, Provider adını güncelleyin:

<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 dosyasını Visual Studio tasarımcısıyla kullanmak için sağlayıcı adını tekrar olarak değiştirmelisiniz.

Ayrıca EntityConnection bağlantı dizesi içindeki sağlayıcı adını da güncelleştirin -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" 
 />

Kod değişiklikleri

Sağlayıcıyı mevcut bir çözümde kullanmak için birkaç kod değişikliği (gerektiği gibi) gerekir.

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

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

Mevcut SQL Server sağlayıcısında kullanılan System.Data.SqlClient sınıflarla çakışmaları önlemek için aşağıdaki sınıflar yeniden adlandırıldı:

SqlAzureExecutionStrategy =>MicrosoftSqlAzureExecutionStrategy

SqlDbConfiguration =>MicrosoftSqlDbConfiguration

SqlProviderServices =>MicrosoftSqlProviderServices

SqlServerMigrationSqlGenerator =>MicrosoftSqlServerMigrationSqlGenerator

SqlSpatialServices =>MicrosoftSqlSpatialServices

SqlConnectionFactory =>MicrosoftSqlConnectionFactory

LocalDbConnectionFactory =>MicrosoftLocalDbConnectionFactory

Bilinen sorunlar

.NET Framework ve bağlantı dizesi yapılandırmasıyla Azure Uygulaması Hizmeti

.NET Framework ve Azure Uygulama Hizmeti ile bağlantı dizesi yapılandırma özelliği kullanıyorsanız, bu senaryoda bağlantı dizesi ayarının sabit kodlandığı için çalışma zamanı sorunları yaşayabilirsiniz.

Çözüm, aşağıdaki gibi türetilmiş bir MicrosoftSqlDbConfiguration sınıfı kullanmaktır:

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

Ardından bu türetilmiş sınıfı yukarıda açıklanan kod tabanlı yapılandırmada kullanın.

GAC'de yüklü EntityFramework.dll

.NET Framework GAC'de (Genel Derleme Önbelleği) EntityFramework.dll eski bir sürümü yüklüyse şu hatayı alabilirsiniz:

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

Çözüm, .dll GAC'den kaldırmaktır. EF6 derlemeleri hiçbir zaman GAC'ye yüklenmemelidir.