Aracılığıyla paylaş


Entity Framework 6 sağlayıcı modeli

Entity Framework sağlayıcı modeli, Entity Framework'ün farklı veritabanı sunucusu türleriyle kullanılmasını sağlar. Örneğin, ef'in Microsoft SQL Server'da kullanılmasına izin vermek için bir sağlayıcı takılabilirken, EF'nin Microsoft SQL Server Compact Edition'da kullanılmasına izin vermek için başka bir sağlayıcı takılabilir. Ef6'nın farkında olduğumuz sağlayıcıları Entity Framework sağlayıcıları sayfasında bulabilirsiniz.

EF'nin açık kaynak lisansı altında yayımlanmasına izin vermek için EF'nin sağlayıcılarla etkileşim kurma yönteminde bazı değişiklikler yapılması gerekiyordu. Bu değişiklikler, EF sağlayıcılarının EF6 derlemelerine karşı yeniden oluşturulmasını ve sağlayıcının kaydı için yeni mekanizmalar yapılmasını gerektirir.

Yeni -den oluşturuluyor

EF6 ile daha önce .NET Framework'ün parçası olan çekirdek kod artık bant dışı (OOB) derlemeler olarak gönderiliyor. EF6'ya karşı uygulama oluşturmayla ilgili ayrıntılar EF6 için uygulamaları güncelleştirme sayfasında bulunabilir. Sağlayıcıların da bu yönergeler kullanılarak yeniden oluşturulması gerekir.

Sağlayıcı türlerine genel bakış

EF sağlayıcısı, bu hizmetlerin (temel sınıf için) veya (arabirim için) genişletdiği CLR türleri tarafından tanımlanan sağlayıcıya özgü hizmetlerden oluşan bir koleksiyondur. Bu hizmetlerden ikisi EF'nin çalışması için temel ve gereklidir. Diğerleri isteğe bağlıdır ve yalnızca belirli işlevler gerekliyse ve/veya bu hizmetlerin varsayılan uygulamaları hedeflenen belirli veritabanı sunucusu için çalışmazsa uygulanmalıdır.

Temel sağlayıcı türleri

Dbproviderfactory

EF, tüm alt düzey veritabanı erişimini gerçekleştirmek için System.Data.Common.DbProviderFactory'den türetilmiş bir türe sahip olmasına bağlıdır. DbProviderFactory aslında EF'nin bir parçası değildir, bunun yerine .NET Framework'te ef, diğer O/RM'ler veya doğrudan bir uygulama tarafından kullanılan ADO.NET sağlayıcıları için bağlantı, komut, parametre ve diğer ADO.NET soyutlama örneklerini sağlayıcıdan bağımsız bir şekilde elde etmek için kullanılabilecek bir giriş noktası sunan bir sınıftır. DbProviderFactory hakkında daha fazla bilgi ADO.NET için MSDN belgelerinde bulunabilir.

DbProviderServices

EF, ADO.NET sağlayıcısı tarafından sağlanan işlevselliğin yanı sıra EF tarafından gereken ek işlevleri sağlamak için DbProviderServices'ten türetilmiş bir türe sahip olmasına bağlıdır. EF'in eski sürümlerinde DbProviderServices sınıfı .NET Framework'ün bir parçasıydı ve System.Data.Common ad alanında bulundu. EF6'dan başlayarak bu sınıf artık EntityFramework.dll dosyasının bir parçasıdır ve System.Data.Entity.Core.Common ad alanındadır.

DbProviderServices uygulamasının temel işlevleri hakkında daha fazla bilgi MSDN'de bulunabilir. Ancak, kavramların çoğu hala geçerli olsa da, bu bilgilerin yazıldığından itibaren EF6 için güncelleştirilmediğini unutmayın. DbProviderServices'in SQL Server ve SQL Server Compact uygulamaları da açık kaynak kod tabanında kullanıma alınır ve diğer uygulamalar için yararlı başvurular olarak kullanılabilir.

EF'nin eski sürümlerinde kullanılacak DbProviderServices uygulaması doğrudan bir ADO.NET sağlayıcısından alınıyordu. Bu, DbProviderFactory IServiceProvider'a yayınlanarak ve GetService yöntemi çağrılarak gerçekleştirilir. Bu, EF sağlayıcısını DbProviderFactory ile sıkı bir şekilde bir araya getirmektedir. Bu bağlama EF'nin .NET Framework'ten taşınmasını engellemiştir ve bu nedenle EF6 için bu sıkı bağlama kaldırılmıştır ve dbProviderServices uygulaması, aşağıdaki DbProviderServices'i Kaydetme bölümünde daha ayrıntılı olarak açıklandığı gibi uygulamanın yapılandırma dosyasına veya kod tabanlı yapılandırmaya doğrudan kaydedilir.

Ek hizmetler

Yukarıda açıklanan temel hizmetlere ek olarak, EF tarafından her zaman veya bazen sağlayıcıya özgü olan birçok hizmet daha vardır. Bu hizmetlerin sağlayıcıya özgü varsayılan uygulamaları bir DbProviderServices uygulaması tarafından sağlanabilir. Uygulamalar ayrıca bu hizmetlerin uygulamalarını geçersiz kılabilir veya DbProviderServices türü varsayılan sağlamadığında uygulamalar sağlayabilir. Bu, aşağıdaki Ek hizmetleri çözümleme bölümünde daha ayrıntılı olarak açıklanmıştır.

Bir sağlayıcının ilgilenebileceği ek hizmet türleri aşağıda listelenmiştir. Bu hizmet türlerinin her biri hakkında daha fazla bilgi API belgelerinde bulunabilir.

IDbExecutionStrategy

Bu, bir sağlayıcının veritabanında sorgular ve komutlar yürütülürken yeniden denemeler veya başka davranışlar uygulamasına olanak tanıyan isteğe bağlı bir hizmettir. Hiçbir uygulama sağlanmazsa EF yalnızca komutları yürütür ve oluşan özel durumları yayacaktır. SQL Server için bu hizmet, SQL Azure gibi bulut tabanlı veritabanı sunucularında çalışırken özellikle yararlı olan bir yeniden deneme ilkesi sağlamak için kullanılır.

IDb Bağlan ionFactory

Bu, bir sağlayıcının yalnızca veritabanı adı verildiğinde kurala göre Db Bağlan ion nesneleri oluşturmasına olanak tanıyan isteğe bağlı bir hizmettir. Bu hizmetin bir DbProviderServices uygulaması tarafından çözümlenebileceği halde EF 4.1'den bu yana mevcut olduğunu ve yapılandırma dosyasında veya kodda açıkça ayarlanabileceğini unutmayın. Sağlayıcı yalnızca varsayılan sağlayıcı olarak kayıtlıysa (aşağıdaki varsayılan sağlayıcıya bakın) ve başka bir yerde varsayılan bir bağlantı fabrikası ayarlanmamışsa bu hizmeti çözme şansına sahip olur.

DbSpatialServices

Bu, bir sağlayıcının coğrafya ve geometri uzamsal türleri için destek eklemesine olanak tanıyan isteğe bağlı bir hizmettir. Bir uygulamanın uzamsal türlerle EF kullanması için bu hizmetin bir uygulaması sağlanmalıdır. DbSptialServices iki şekilde istenir. İlk olarak, sağlayıcıya özgü uzamsal hizmetler anahtar olarak bir DbProviderInfo nesnesi (sabit ad ve bildirim belirteci içeren) kullanılarak istenir. İkincisi, DbSpatialServices anahtar olmadan istenebilir. Bu, tek başına DbGeography veya DbGeometry türleri oluştururken kullanılan "küresel uzamsal sağlayıcıyı" çözümlemek için kullanılır.

MigrationSqlGenerator

Bu, EF Migrations'ın Code First ile veritabanı şemaları oluştururken ve değiştirirken kullanılan SQL'in oluşturulması için kullanılmasını sağlayan isteğe bağlı bir hizmettir. Geçişleri desteklemek için bir uygulama gereklidir. Bir uygulama sağlanırsa, veritabanları veritabanı başlatıcıları veya Database.Create yöntemi kullanılarak oluşturulduğunda da kullanılır.

Func<Db Bağlan ion, string, HistoryContextFactory>

Bu, bir sağlayıcının Ef Migrations tarafından kullanılan tabloya HistoryContext eşlemesini yapılandırmasına __MigrationHistory olanak tanıyan isteğe bağlı bir hizmettir. HistoryContext bir Code First DbContext'tir ve tablonun adı ve sütun eşleme belirtimleri gibi öğeleri değiştirmek için normal akıcı API kullanılarak yapılandırılabilir. Tüm varsayılan tablo ve sütun eşlemeleri bu sağlayıcı tarafından destekleniyorsa, ef tarafından tüm sağlayıcılar için döndürülen bu hizmetin varsayılan uygulaması belirli bir veritabanı sunucusu için çalışabilir. Böyle bir durumda sağlayıcının bu hizmetin bir uygulamasını sağlaması gerekmez.

IDbProviderFactoryResolver

Bu, belirli bir Db Bağlan ion nesnesinden doğru DbProviderFactory'yi almak için isteğe bağlı bir hizmettir. Tüm sağlayıcılar için EF tarafından döndürülen bu hizmetin varsayılan uygulaması, tüm sağlayıcılar için çalışacak şekilde tasarlanmıştır. Bununla birlikte, .NET 4'te çalıştırılırken DbProviderFactory'ye, Db Bağlan ions ise genel olarak erişilemez. Bu nedenle EF, bir eşleşme bulmak için kayıtlı sağlayıcılarda arama yapmak için bazı buluşsal yöntemler kullanır. Bazı sağlayıcılar için bu buluşsal yöntemler başarısız olabilir ve bu gibi durumlarda sağlayıcının yeni bir uygulama sağlaması gerekir.

DbProviderServices'i kaydetme

Kullanılacak DbProviderServices uygulaması, uygulamanın yapılandırma dosyasına (app.config veya web.config) veya kod tabanlı yapılandırma kullanılarak kaydedilebilir. Her iki durumda da kayıtta anahtar olarak sağlayıcının "sabit adı" kullanılır. Bu, birden çok sağlayıcının tek bir uygulamada kaydedilmesini ve kullanılmasını sağlar. EF kayıtları için kullanılan sabit ad, ADO.NET sağlayıcı kaydı ve bağlantı dizesi için kullanılan sabit adla aynıdır. Örneğin, SQL Server için "System.Data.SqlClient" sabit adı kullanılır.

Yapılandırma dosyası kaydı

Kullanılacak DbProviderServices türü, uygulamanın yapılandırma dosyasının entityFramework bölümünün sağlayıcılar listesinde sağlayıcı öğesi olarak kaydedilir. Örnek:

<entityFramework>
  <providers>
    <provider invariantName="My.Invariant.Name" type="MyProvider.MyProviderServices, MyAssembly" />
  </providers>
</entityFramework>

Tür dizesi, kullanılacak DbProviderServices uygulamasının derleme türü adı olmalıdır.

Kod tabanlı kayıt

EF6 sağlayıcılarından başlayarak kod kullanılarak da kaydedilebilir. Bu, bir EF sağlayıcısının uygulamanın yapılandırma dosyasında herhangi bir değişiklik yapılmadan kullanılmasını sağlar. Kod tabanlı yapılandırmayı kullanmak için bir uygulamanın, kod tabanlı yapılandırma belgelerinde açıklandığı gibi bir DbConfiguration sınıfı oluşturması gerekir. DbConfiguration sınıfının oluşturucusunun EF sağlayıcısını kaydetmek için SetProviderServices çağrısı yapması gerekir. Örnek:

public class MyConfiguration : DbConfiguration
{
    public MyConfiguration()
    {
        SetProviderServices("My.New.Provider", new MyProviderServices());
    }
}

Ek hizmetleri çözümleme

Sağlayıcı türlerine genel bakış bölümünde yukarıda belirtildiği gibi, dbProviderServices sınıfı ek hizmetleri çözümlemek için de kullanılabilir. DbProviderServices IDbDependencyResolver uyguladığından ve her kayıtlı DbProviderServices türü "varsayılan çözümleyici" olarak eklendiğinden bu mümkündür. IDbDpendencyResolver mekanizması Bağımlılık Çözümlemesi'nde daha ayrıntılı olarak açıklanmıştır. Ancak, bir sağlayıcıdaki ek hizmetleri çözümlemek için bu belirtimdeki tüm kavramların anlaşılması gerekmez.

Bir sağlayıcının ek hizmetleri çözümlemesinin en yaygın yolu, DbProviderServices sınıfının oluşturucusunda her hizmet için DbProviderServices.AddDependencyResolver çağrısı yapmaktır. Örneğin, SqlProviderServices (SQL Server için EF sağlayıcısı) başlatma için aşağıdakine benzer bir koda sahiptir:

private SqlProviderServices()
{
    AddDependencyResolver(new SingletonDependencyResolver<IDbConnectionFactory>(
        new SqlConnectionFactory()));

    AddDependencyResolver(new ExecutionStrategyResolver<DefaultSqlExecutionStrategy>(
        "System.data.SqlClient", null, () => new DefaultSqlExecutionStrategy()));

    AddDependencyResolver(new SingletonDependencyResolver<Func<MigrationSqlGenerator>>(
        () => new SqlServerMigrationSqlGenerator(), "System.data.SqlClient"));

    AddDependencyResolver(new SingletonDependencyResolver<DbSpatialServices>(
        SqlSpatialServices.Instance,
        k =>
        {
            var asSpatialKey = k as DbProviderInfo;
            return asSpatialKey == null
                || asSpatialKey.ProviderInvariantName == ProviderInvariantName;
        }));
}

Bu oluşturucu aşağıdaki yardımcı sınıfları kullanır:

  • SingletonDependencyResolver: GetService her çağrıldığında aynı örneğin döndürüldiği Singleton hizmetlerini(yani hizmetlerini) çözümlemek için basit bir yol sağlar. Geçici hizmetler genellikle isteğe bağlı olarak geçici örnekler oluşturmak için kullanılacak tek bir fabrika olarak kaydedilir.
  • ExecutionStrategyResolver: IExecutionStrategy uygulamalarını döndürmeye özgü bir çözümleyici.

DbProviderServices.AddDependencyResolver kullanmak yerine DbProviderServices.GetService'i geçersiz kılmak ve ek hizmetleri doğrudan çözümlemek de mümkündür. EF belirli bir tür ve bazı durumlarda belirli bir anahtar için tanımlanmış bir hizmete ihtiyaç duyduğunda bu yöntem çağrılır. Yöntemin hizmeti döndürebilmesi veya null döndürerek hizmeti döndürmeyi geri çevirmesi ve bunun yerine başka bir sınıfın bu sorunu çözmesine izin vermesi gerekir. Örneğin, varsayılan bağlantı fabrikasını çözümlemek için GetService'teki kod şuna benzer olabilir:

public override object GetService(Type type, object key)
{
    if (type == typeof(IDbConnectionFactory))
    {
        return new SqlConnectionFactory();
    }
    return null;
}

Kayıt siparişi

Bir uygulamanın yapılandırma dosyasına birden çok DbProviderServices uygulaması kaydedildiğinde, bunlar listelendikleri sırayla ikincil çözümleyiciler olarak eklenir. Çözümleyiciler her zaman ikincil çözümleyici zincirinin en üstüne eklendiğinden, listenin sonundaki sağlayıcının bağımlılıkları diğerlerinden önce çözme şansına sahip olacağı anlamına gelir. (Bu ilk başta biraz sezgisel görünebilir, ancak her sağlayıcıyı listeden çıkarıp mevcut sağlayıcıların üzerine yığma hayal ederseniz mantıklıdır.)

Çoğu sağlayıcı hizmeti sağlayıcıya özgü olduğundan ve sağlayıcı sabit adıyla anahtarlandığından bu sıralama genellikle önemli değildir. Ancak sağlayıcı sabit adı veya sağlayıcıya özgü başka bir anahtar tarafından anahtarlandırılmayan hizmetler için hizmet bu sıralamaya göre çözümlenir. Örneğin, başka bir yerde açıkça farklı ayarlanmadıysa, varsayılan bağlantı fabrikası zincirdeki en üst sağlayıcıdan gelir.

Ek yapılandırma dosyası kayıtları

Yukarıda açıklanan ek sağlayıcı hizmetlerinden bazılarını doğrudan bir uygulamanın yapılandırma dosyasına açıkça kaydetmek mümkündür. Bu yapıldığında, DbProviderServices uygulamasının GetService yöntemi tarafından döndürülen her şey yerine yapılandırma dosyasındaki kayıt kullanılır.

Varsayılan bağlantı fabrikasını kaydetme

EF5'den başlayarak EntityFramework NuGet paketi otomatik olarak SQL Express bağlantı fabrikasını veya LocalDb bağlantı fabrikasını yapılandırma dosyasına kaydettirdi.

Örnek:

<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" >
</entityFramework>

Tür, IDb Bağlan ionFactory uygulaması gereken varsayılan bağlantı fabrikası için derlemeye uygun tür adıdır.

Bir sağlayıcı NuGet paketinin yüklendiğinde varsayılan bağlantı fabrikasını bu şekilde ayarlaması önerilir. Aşağıdaki Sağlayıcılar için NuGet Paketleri'ne bakın.

Ek EF6 sağlayıcı değişiklikleri

Uzamsal sağlayıcı değişiklikleri

Uzamsal türleri destekleyen sağlayıcıların artık DbSpatialDataReader'dan türetilen sınıflarda bazı ek yöntemler uygulaması gerekir:

  • public abstract bool IsGeographyColumn(int ordinal)
  • public abstract bool IsGeometryColumn(int ordinal)

Ayrıca, varsayılan uygulamalar zaman uyumlu yöntemlere temsilci olarak geçersiz kılınması önerilen ve bu nedenle zaman uyumsuz olarak yürütülmeyen yeni zaman uyumsuz yöntemler de vardır:

  • public virtual Task<DbGeography> GetGeographyAsync(int ordinal, CancellationToken cancellationToken)
  • public virtual Task<DbGeometry> GetGeometryAsync(int ordinal, CancellationToken cancellationToken)

Enumerable.Contains için yerel destek

EF6, LINQ sorgularında Enumerable.Contains kullanımıyla ilgili performans sorunlarını gidermek için eklenen yeni bir ifade türü olan DbInExpression'ı tanıtır. DbProviderManifest sınıfı, bir sağlayıcının yeni ifade türünü işleyerek işlemediğini belirlemek için EF tarafından çağrılan SupportsInExpression adlı yeni bir sanal yönteme sahiptir. Mevcut sağlayıcı uygulamalarıyla uyumluluk için yöntemi false döndürür. Bu geliştirmeden yararlanmak için EF6 sağlayıcısı DbInExpression'ı işlemek için kod ekleyebilir ve SupportsInExpression'ı geçersiz kılarak true döndürebilir. DbExpressionBuilder.In yöntemi çağrılarak DbInExpression örneği oluşturulabilir. DbInExpression örneği, genellikle bir tablo sütununu temsil eden bir DbExpression'dan ve eşleşmeyi test etmek için DbConstantExpression listesinden oluşur.

Sağlayıcılar için NuGet paketleri

EF6 sağlayıcısını kullanılabilir hale getirmenin bir yolu, bunu NuGet paketi olarak yayınlamaktır. NuGet paketi kullanmanın avantajları şunlardır:

  • Uygulamanın yapılandırma dosyasına sağlayıcı kaydını eklemek için NuGet'i kullanmak kolaydır
  • Kural tarafından yapılan bağlantıların kayıtlı sağlayıcıyı kullanması için varsayılan bağlantı fabrikasını ayarlamak için yapılandırma dosyasında ek değişiklikler yapılabilir
  • NuGet, yeni bir EF paketi yayımlandıktan sonra bile EF6 sağlayıcısının çalışmaya devam etmesi için bağlama yeniden yönlendirmeleri eklemeyi işler

Bunun bir örneği, açık kaynak kod tabanına dahil edilen EntityFramework.SqlServerCompact paketidir. Bu paket, EF sağlayıcısı NuGet paketleri oluşturmak için iyi bir şablon sağlar.

PowerShell komutları

EntityFramework NuGet paketi yüklendiğinde, sağlayıcı paketleri için çok yararlı olan iki komut içeren bir PowerShell modülü kaydeder:

  • Add-EFProvider, hedef projenin yapılandırma dosyasına sağlayıcı için yeni bir varlık ekler ve kayıtlı sağlayıcılar listesinin sonunda olduğundan emin olur.
  • Add-EFDefault Bağlan ionFactory, hedef projenin yapılandırma dosyasına varsayılan Bağlan ionFactory kaydını ekler veya güncelleştirir.

Her iki komut da yapılandırma dosyasına bir entityFramework bölümü ekleme ve gerekirse bir sağlayıcı koleksiyonu ekleme ile ilgilenir.

Bu komutların install.ps1 NuGet betiğinden çağrılmış olması amaçlanmıştır. Örneğin, SQL Compact sağlayıcısı için install.ps1 şuna benzer:

param($installPath, $toolsPath, $package, $project)
Add-EFDefaultConnectionFactory $project 'System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework' -ConstructorArguments 'System.Data.SqlServerCe.4.0'
Add-EFProvider $project 'System.Data.SqlServerCe.4.0' 'System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact'</pre>

Bu komutlar hakkında daha fazla bilgi için Paket Yöneticisi Konsolu penceresinde get-help komutunu kullanabilirsiniz.

Sarmalama sağlayıcıları

Sarmalama sağlayıcısı, mevcut sağlayıcıyı profil oluşturma veya izleme özellikleri gibi diğer işlevlerle genişletmek üzere sarmalayan bir EF ve/veya ADO.NET sağlayıcısıdır. Sarmalama sağlayıcıları normal şekilde kaydedilebilir, ancak genellikle sağlayıcıyla ilgili hizmetlerin çözümünü keserek sarmalama sağlayıcısını çalışma zamanında ayarlamak daha uygundur. Bunu yapmak için DbConfiguration sınıfındaki OnLockingConfiguration statik olayı kullanılabilir.

Uygulama etki alanı için tüm EF yapılandırmasının nereden alınacağını ancak kullanım için kilitlenmeden önce EF tarafından belirlendikten sonra OnLockingConfiguration çağrılır. Uygulama başlangıcında (EF kullanılmadan önce) uygulamanın bu olay için bir olay işleyicisi kaydetmesi gerekir. (Bu işleyiciyi yapılandırma dosyasına kaydetmek için destek eklemeyi düşünüyoruz, ancak bu henüz desteklenmiyor.) Olay işleyicisi daha sonra sarmalanması gereken her hizmet için ReplaceService çağrısı yapmalıdır.

Örneğin, IDb Bağlan ionFactory ve DbProviderService'i sarmamak için aşağıdaki gibi bir işleyici kaydedilmelidir:

DbConfiguration.OnLockingConfiguration +=
    (_, a) =>
    {
        a.ReplaceService<DbProviderServices>(
            (s, k) => new MyWrappedProviderServices(s));

        a.ReplaceService<IDbConnectionFactory>(
            (s, k) => new MyWrappedConnectionFactory(s));
    };

Çözümlenen ve artık hizmeti çözümlemek için kullanılan anahtarla birlikte sarmalanması gereken hizmet işleyiciye geçirilir. İşleyici daha sonra bu hizmeti sarmalayabilir ve döndürülen hizmeti sarmalanmış sürümle değiştirebilir.

EF ile DbProviderFactory'yi Çözümleme

DbProviderFactory, yukarıdaki Sağlayıcı türlerine genel bakış bölümünde açıklandığı gibi EF tarafından gereken temel sağlayıcı türlerinden biridir. Daha önce de belirtildiği gibi, Bu bir EF türü değildir ve kayıt genellikle EF yapılandırmasının bir parçası değildir, bunun yerine machine.config dosyasındaki ve/veya uygulamanın yapılandırma dosyasındaki normal ADO.NET sağlayıcı kaydıdır.

Bu EF yine de kullanmak üzere bir DbProviderFactory ararken normal bağımlılık çözümleme mekanizmasını kullanır. Varsayılan çözümleyici, yapılandırma dosyalarında normal ADO.NET kaydını kullanır ve bu nedenle genellikle saydamdır. Ancak normal bağımlılık çözümleme mekanizması kullanıldığından, normal ADO.NET kaydı yapılmamış olsa bile bir DbProviderFactory'yi çözümlemek için IDbDependencyResolver kullanılabilir.

DbProviderFactory'yi bu şekilde çözümlemenin çeşitli etkileri vardır:

  • Kod tabanlı yapılandırma kullanan bir uygulama, uygun DbProviderFactory'yi kaydetmek için DbConfiguration sınıfına çağrı ekleyebilir. Bu, özellikle herhangi bir dosya tabanlı yapılandırmayı kullanmak istemeyen (veya kullanamayan) uygulamalar için kullanışlıdır.
  • Hizmet, yukarıdaki Sarmalama sağlayıcıları bölümünde açıklandığı gibi ReplaceService kullanılarak sarmalanabilir veya değiştirilebilir
  • Teorik olarak, bir DbProviderServices uygulaması bir DbProviderFactory'yi çözümleyebiliyor.

Bu işlemlerden herhangi birini yapma konusunda dikkat edilmesi gereken önemli nokta, bunların yalnızca EF tarafından DbProviderFactory aramasını etkileyeceğidir. EF olmayan diğer kodlar hala ADO.NET sağlayıcısının normal şekilde kaydedilmesini bekleyebilir ve kayıt bulunamazsa başarısız olabilir. Bu nedenle, bir DbProviderFactory'nin normal ADO.NET şekilde kaydedilmesi normalde daha iyidir.

DbProviderFactory'yi çözümlemek için EF kullanılıyorsa, IProviderInvariantName ve IDbProviderFactoryResolver hizmetlerini de çözümlemelidir.

IProviderInvariantName, belirli bir DbProviderFactory türü için sağlayıcı sabit adını belirlemek için kullanılan bir hizmettir. Bu hizmetin varsayılan uygulaması, ADO.NET sağlayıcı kaydını kullanır. Bu, DbProviderFactory EF tarafından çözümlendiğinden ADO.NET sağlayıcısı normal şekilde kaydedilmediyse, bu hizmeti çözmek için de gerekli olacağı anlamına gelir. DbConfiguration.SetProviderFactory yöntemi kullanılırken bu hizmet için bir çözümleyicinin otomatik olarak eklendiğini unutmayın.

Yukarıdaki Sağlayıcı türlerine genel bakış bölümünde açıklandığı gibi, belirli bir Db Bağlan ion nesnesinden doğru DbProviderFactory'yi almak için IDbProviderFactoryResolver kullanılır. .NET 4'te çalıştırılırken bu hizmetin varsayılan uygulaması ADO.NET sağlayıcı kaydını kullanır. Bu, DbProviderFactory EF tarafından çözümlendiğinden ADO.NET sağlayıcısı normal şekilde kaydedilmediyse, bu hizmeti çözmek için de gerekli olacağı anlamına gelir.