Udostępnij za pośrednictwem


Model dostawcy programu Entity Framework 6

Model dostawcy programu Entity Framework umożliwia korzystanie z programu Entity Framework z różnymi typami serwera bazy danych. Na przykład jeden dostawca może być podłączony, aby umożliwić korzystanie z programu EF w programie Microsoft SQL Server, podczas gdy inny dostawca może być podłączony do programu , aby umożliwić korzystanie z programu EF w programie Microsoft SQL Server Compact Edition. Dostawcy ef6, których wiemy, można znaleźć na stronie dostawców programu Entity Framework.

Niektóre zmiany były wymagane do sposobu interakcji ef z dostawcami w celu umożliwienia wydania programu EF na podstawie licencji open source. Te zmiany wymagają ponownego kompilowania dostawców ef6 w odniesieniu do zestawów EF6 wraz z nowymi mechanizmami rejestracji dostawcy.

Odbudowy

W przypadku platformy EF6 podstawowy kod, który był wcześniej częścią programu .NET Framework, jest teraz dostarczany jako zestawy poza pasmem (OOB). Szczegółowe informacje na temat tworzenia aplikacji na platformie EF6 można znaleźć na stronie Aktualizowanie aplikacji dla platformy EF6 . Dostawcy będą również musieli zostać ponownie skompilowany przy użyciu tych instrukcji.

Omówienie typów dostawców

Dostawca ef jest naprawdę kolekcją usług specyficznych dla dostawcy zdefiniowanych przez typy CLR, które te usługi rozszerzają (dla klasy bazowej) lub implementują (dla interfejsu). Dwie z tych usług są fundamentalne i niezbędne do działania ef w ogóle. Inne są opcjonalne i muszą być implementowane tylko wtedy, gdy wymagana jest określona funkcjonalność i/lub domyślne implementacje tych usług nie działają w przypadku docelowego określonego serwera bazy danych.

Podstawowe typy dostawców

DbProviderFactory

Program EF zależy od typu pochodzącego z elementu System.Data.Common.DbProviderFactory w celu uzyskania dostępu do bazy danych niskiego poziomu. DbProviderFactory nie jest faktycznie częścią ef, ale jest zamiast tego klasą w programie .NET Framework, która obsługuje punkt wejścia dla dostawców ADO.NET, które mogą być używane przez ef, inne maszyny O/RM lub bezpośrednio przez aplikację w celu uzyskania wystąpień połączeń, poleceń, parametrów i innych abstrakcji ADO.NET w sposób niezależny od dostawcy. Więcej informacji na temat dbProviderFactory można znaleźć w dokumentacji MSDN dla ADO.NET.

DbProviderServices

Program EF zależy od typu pochodzącego z dbProviderServices w celu zapewnienia dodatkowych funkcji potrzebnych przez program EF na podstawie funkcji udostępnianych już przez dostawcę ADO.NET. W starszych wersjach programu EF klasa DbProviderServices była częścią programu .NET Framework i została znaleziona w przestrzeni nazw System.Data.Common. Począwszy od ef6 ta klasa jest teraz częścią EntityFramework.dll i znajduje się w przestrzeni nazw System.Data.Entity.Core.Common.

Więcej szczegółów na temat podstawowych funkcji implementacji DbProviderServices można znaleźć w witrynie MSDN. Należy jednak pamiętać, że od czasu pisania tych informacji nie są aktualizowane dla programu EF6, chociaż większość pojęć jest nadal ważna. Implementacje dbProviderServices programu SQL Server i programu SQL Server Compact są również zaewidencjonowane w bazie kodu typu open source i mogą służyć jako przydatne odwołania do innych implementacji.

W starszych wersjach programu EF implementacja DbProviderServices do użycia została uzyskana bezpośrednio od dostawcy ADO.NET. Zostało to zrobione przez rzutowanie elementu DbProviderFactory do IServiceProvider i wywołanie metody GetService. To ściśle powiązane dostawcy EF z DbProviderFactory. To sprzężenie zablokowało przeniesienie programu EF z programu .NET Framework i w związku z tym w przypadku programu EF6 to ścisłe sprzężenie zostało usunięte, a implementacja dbProviderServices jest teraz zarejestrowana bezpośrednio w pliku konfiguracji aplikacji lub w konfiguracji opartej na kodzie, zgodnie z opisem w poniższej sekcji Rejestrowanie dbProviderServices .

Usługi dodatkowe

Oprócz podstawowych usług opisanych powyżej istnieje również wiele innych usług używanych przez program EF, które są zawsze lub czasami specyficzne dla dostawcy. Domyślne implementacje tych usług specyficzne dla dostawcy mogą być dostarczane przez implementację DbProviderServices. Aplikacje mogą również zastąpić implementacje tych usług lub zapewnić implementacje, gdy typ DbProviderServices nie zapewnia wartości domyślnej. Opisano to bardziej szczegółowo w sekcji Rozwiązywanie dodatkowych usług poniżej.

Poniżej wymieniono dodatkowe typy usług, których może zainteresować dostawca. Więcej informacji na temat każdego z tych typów usług można znaleźć w dokumentacji interfejsu API.

IDbExecutionStrategy

Jest to opcjonalna usługa, która umożliwia dostawcy implementowanie ponownych prób lub innych zachowań, gdy zapytania i polecenia są wykonywane względem bazy danych. Jeśli implementacja nie zostanie podana, program EF po prostu wykona polecenia i rozpropaguje zgłoszone wyjątki. W przypadku programu SQL Server ta usługa służy do udostępniania zasad ponawiania, które są szczególnie przydatne podczas uruchamiania na serwerach baz danych opartych na chmurze, takich jak Usługi SQL Azure.

IDbConnectionFactory

Jest to opcjonalna usługa, która umożliwia dostawcy tworzenie obiektów DbConnection według konwencji, gdy podano tylko nazwę bazy danych. Należy pamiętać, że chociaż tę usługę można rozpoznać za pomocą implementacji DbProviderServices, została ona obecna od czasu ef 4.1 i może być również jawnie ustawiona w pliku konfiguracji lub w kodzie. Dostawca będzie miał szansę rozwiązać tę usługę tylko wtedy, gdy został zarejestrowany jako dostawca domyślny (zobacz domyślny dostawca poniżej) i jeśli domyślna fabryka połączeń nie została ustawiona w innym miejscu.

DbSpatialServices

Jest to opcjonalne usługi, które umożliwiają dostawcy dodawanie obsługi typów geograficznych i geometrycznych. Aby aplikacja korzystała z programu EF z typami przestrzennymi, należy podać implementację tej usługi. Usługa DbSpatialServices jest pytana na dwa sposoby. Najpierw usługi przestrzenne specyficzne dla dostawcy są żądane przy użyciu obiektu DbProviderInfo (który zawiera niezmienną nazwę i token manifestu) jako klucz. Po drugie, dbSpatialServices można poprosić o bez klucza. Służy do rozpoznawania "globalnego dostawcy przestrzennego", który jest używany podczas tworzenia autonomicznych typów DbGeography lub DbGeometry.

MigrationSqlGenerator

Jest to opcjonalna usługa, która umożliwia migracje EF do generowania kodu SQL używanego w tworzeniu i modyfikowaniu schematów bazy danych za pomocą funkcji Code First. Aby obsługiwać migracje, wymagana jest implementacja. Jeśli zostanie podana implementacja, będzie ona również używana podczas tworzenia baz danych przy użyciu inicjatorów bazy danych lub metody Database.Create.

Func<DbConnection, string, HistoryContextFactory>

Jest to opcjonalna usługa, która umożliwia dostawcy skonfigurowanie mapowania obiektu HistoryContext na tabelę używaną __MigrationHistory przez migracje ef. HistoryContext to kod First DbContext i można go skonfigurować przy użyciu normalnego płynnego interfejsu API, aby zmienić elementy, takie jak nazwa tabeli i specyfikacje mapowania kolumn. Domyślna implementacja tej usługi zwracana przez program EF dla wszystkich dostawców może działać dla danego serwera bazy danych, jeśli wszystkie domyślne mapowania tabel i kolumn są obsługiwane przez tego dostawcę. W takim przypadku dostawca nie musi dostarczać implementacji tej usługi.

IDbProviderFactoryResolver

Jest to opcjonalna usługa służąca do uzyskiwania poprawnego obiektu DbProviderFactory z danego obiektu DbConnection. Domyślna implementacja tej usługi zwrócona przez platformę EF dla wszystkich dostawców jest przeznaczona do pracy dla wszystkich dostawców. Jednak w przypadku uruchamiania na platformie .NET 4 element DbProviderFactory nie jest publicznie dostępny z poziomu jednego, jeśli jest to element DbConnections. W związku z tym ef używa niektórych heurystyki do wyszukiwania zarejestrowanych dostawców w celu znalezienia dopasowania. Istnieje możliwość, że w przypadku niektórych dostawców te heurystyki unikną awarii i w takich sytuacjach dostawca powinien dostarczyć nową implementację.

Rejestrowanie obiektów DbProviderServices

Implementacja DbProviderServices do użycia może być zarejestrowana w pliku konfiguracji aplikacji (app.config lub web.config) lub przy użyciu konfiguracji opartej na kodzie. W obu przypadkach rejestracja używa "niezmiennej nazwy" dostawcy jako klucza. Dzięki temu wielu dostawców może być zarejestrowanych i używanych w jednej aplikacji. Niezmienna nazwa używana do rejestracji ef jest taka sama jak niezmienna nazwa używana do rejestracji dostawcy ADO.NET i parametry połączenia. Na przykład dla programu SQL Server jest używana niezmienna nazwa "System.Data.SqlClient".

Rejestracja w pliku konfiguracji

Typ DbProviderServices do użycia jest zarejestrowany jako element dostawcy na liście dostawców sekcji entityFramework pliku konfiguracji aplikacji. Na przykład:

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

Ciąg typu musi być kwalifikowaną nazwą typu zestawu implementacji DbProviderServices do użycia.

Rejestracja oparta na kodzie

Począwszy od dostawców EF6, można również zarejestrować przy użyciu kodu. Dzięki temu dostawca ef może być używany bez żadnych zmian w pliku konfiguracji aplikacji. Aby użyć konfiguracji opartej na kodzie, aplikacja powinna utworzyć klasę DbConfiguration zgodnie z opisem w dokumentacji konfiguracji opartej na kodzie. Konstruktor klasy DbConfiguration powinien następnie wywołać metodę SetProviderServices, aby zarejestrować dostawcę ef. Na przykład:

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

Rozwiązywanie problemów z dodatkowymi usługami

Jak wspomniano powyżej w sekcji Przegląd typów dostawców, można również użyć klasy DbProviderServices do rozpoznawania dodatkowych usług. Jest to możliwe, ponieważ usługa DbProviderServices implementuje element IDbDependencyResolver, a każdy zarejestrowany typ DbProviderServices jest dodawany jako "domyślny moduł rozpoznawania". Mechanizm IDbDependencyResolver został opisany bardziej szczegółowo w temacie Rozwiązywanie zależności. Nie jest jednak konieczne zrozumienie wszystkich pojęć w tej specyfikacji w celu rozwiązania dodatkowych usług u dostawcy.

Najczęstszym sposobem rozpoznawania dodatkowych usług przez dostawcę jest wywołanie elementu DbProviderServices.AddDependencyResolver dla każdej usługi w konstruktorze klasy DbProviderServices. Na przykład sqlProviderServices (dostawca EF dla programu SQL Server) ma kod podobny do tego w przypadku inicjowania:

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

Ten konstruktor używa następujących klas pomocnika:

  • SingletonDependencyResolver: zapewnia prosty sposób rozwiązywania problemów z usługami Singleton — czyli usługami, dla których to samo wystąpienie jest zwracane za każdym razem, gdy jest wywoływana usługa GetService. Przejściowe usługi są często rejestrowane jako pojedyncza fabryka, która będzie używana do tworzenia przejściowych wystąpień na żądanie.
  • ExecutionStrategyResolver: rozpoznawanie specyficzne dla zwracania implementacji IExecutionStrategy.

Zamiast używać elementu DbProviderServices.AddDependencyResolver, można również zastąpić dbProviderServices.GetServices i bezpośrednio rozwiązać dodatkowe usługi. Ta metoda będzie wywoływana, gdy program EF potrzebuje usługi zdefiniowanej przez określony typ i, w niektórych przypadkach, dla danego klucza. Metoda powinna zwrócić usługę, jeśli może, lub zwrócić wartość null, aby zrezygnować z zwracania usługi, a zamiast tego zezwolić innej klasie na jej rozwiązanie. Na przykład aby rozwiązać problem z domyślną fabryką połączeń, kod w usłudze GetService może wyglądać mniej więcej tak:

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

Kolejność rejestracji

Jeśli wiele implementacji DbProviderServices jest zarejestrowanych w pliku konfiguracji aplikacji, zostaną dodane jako pomocnicze rozpoznawanie nazw w kolejności, w której są one wymienione. Ponieważ narzędzia rozpoznawania nazw są zawsze dodawane na początku łańcucha pomocniczego rozpoznawania nazw, oznacza to, że dostawca na końcu listy będzie mieć szansę na rozwiązanie zależności przed pozostałymi. (Na początku może to wydawać się trochę intuicyjne, ale ma sens, jeśli wyobrażasz sobie, że każdy dostawca z listy i stosuje go na podstawie istniejących dostawców).

Ta kolejność zwykle nie ma znaczenia, ponieważ większość usług dostawcy jest specyficzna dla dostawcy i kluczem według niezmiennej nazwy dostawcy. Jednak w przypadku usług, które nie są kluczem przez niezmienną nazwę dostawcy lub inny klucz specyficzny dla dostawcy, usługa zostanie rozpoznana na podstawie tego zamówienia. Jeśli na przykład nie zostanie jawnie ustawiona inaczej w innym miejscu, domyślna fabryka połączeń będzie pochodzić z najwyższego dostawcy w łańcuchu.

Dodatkowe rejestracje plików konfiguracji

Istnieje możliwość jawnego zarejestrowania niektórych dodatkowych usług dostawcy opisanych powyżej bezpośrednio w pliku konfiguracji aplikacji. Po wykonaniu tej czynności rejestracja w pliku konfiguracji będzie używana zamiast wszystkich elementów zwróconych przez metodę GetService implementacji DbProviderServices.

Rejestrowanie domyślnej fabryki połączeń

Począwszy od ef5 pakiet NuGet EntityFramework automatycznie zarejestrował fabrykę połączeń SQL Express lub fabrykę połączeń LocalDb w pliku konfiguracji.

Na przykład:

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

Typ to nazwa typu kwalifikowanego zestawu dla domyślnej fabryki połączeń, która musi implementować IDbConnectionFactory.

Zaleca się, aby pakiet NuGet dostawcy ustawił domyślną fabrykę połączeń w ten sposób po zainstalowaniu. Zobacz Pakiety NuGet dla dostawców poniżej.

Dodatkowe zmiany dostawcy EF6

Zmiany dostawcy przestrzennego

Dostawcy, którzy obsługują typy przestrzenne, muszą teraz zaimplementować kilka dodatkowych metod dla klas pochodnych z dbSpatialDataReader:

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

Istnieją również nowe asynchroniczne wersje istniejących metod, które są zalecane do zastąpienia, ponieważ domyślne implementacje delegują do metod synchronicznych i dlatego nie są wykonywane asynchronicznie:

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

Natywna obsługa funkcji Enumerable.Contains

Program EF6 wprowadza nowy typ wyrażenia DbInExpression, który został dodany w celu rozwiązania problemów z wydajnością związanych z używaniem funkcji Enumerable.Contains w zapytaniach LINQ. Klasa DbProviderManifest ma nową metodę wirtualną SupportsInExpression, która jest wywoływana przez program EF w celu określenia, czy dostawca obsługuje nowy typ wyrażenia. Aby uzyskać zgodność z istniejącymi implementacjami dostawcy, metoda zwraca wartość false. Aby skorzystać z tego ulepszenia, dostawca EF6 może dodać kod do obsługi dbInExpression i zastąpić SupportsInExpression, aby zwrócić wartość true. Wystąpienie dbInExpression można utworzyć, wywołując metodę DbExpressionBuilder.In. Wystąpienie DbInExpression składa się z elementu DbExpression, zwykle reprezentującego kolumnę tabeli, oraz listę dbConstantExpression do przetestowania pod kątem dopasowania.

Pakiety NuGet dla dostawców

Jednym ze sposobów udostępnienia dostawcy EF6 jest wydanie go jako pakietu NuGet. Korzystanie z pakietu NuGet ma następujące zalety:

  • Łatwo jest użyć narzędzia NuGet, aby dodać rejestrację dostawcy do pliku konfiguracji aplikacji
  • Dodatkowe zmiany można wprowadzić w pliku konfiguracji, aby ustawić domyślną fabrykę połączeń, aby połączenia wykonywane przez konwencję używały zarejestrowanego dostawcy
  • Pakiet NuGet obsługuje dodawanie przekierowań powiązań, dzięki czemu dostawca EF6 powinien nadal działać nawet po wydaniu nowego pakietu EF

Przykładem tego jest pakiet EntityFramework.SqlServerCompact, który znajduje się w bazie kodu open source. Ten pakiet zawiera dobry szablon do tworzenia pakietów NuGet dostawcy ef.

Polecenia programu PowerShell

Po zainstalowaniu pakietu NuGet EntityFramework rejestruje moduł programu PowerShell zawierający dwa polecenia, które są bardzo przydatne w przypadku pakietów dostawcy:

  • Add-EFProvider dodaje nową jednostkę dla dostawcy w pliku konfiguracji projektu docelowego i upewnia się, że znajduje się na końcu listy zarejestrowanych dostawców.
  • Add-EFDefaultConnectionFactory dodaje lub aktualizuje domyślną rejestracjęConnectionFactory w pliku konfiguracji projektu docelowego.

Oba te polecenia dbają o dodanie sekcji entityFramework do pliku konfiguracji i dodanie kolekcji dostawców w razie potrzeby.

Ma to na celu wywołanie tych poleceń ze skryptu NuGet install.ps1. Na przykład install.ps1 dla dostawcy SQL Compact wygląda podobnie do następującego:

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>

Więcej informacji na temat tych poleceń można uzyskać za pomocą polecenia get-help w oknie konsoli Menedżer pakietów.

Dostawcy opakowujące

Dostawca opakowujący jest dostawcą EF i/lub ADO.NET, który opakowuje istniejącego dostawcę w celu rozszerzenia go o inne funkcje, takie jak profilowanie lub śledzenie możliwości. Dostawcy opakowujący mogą być zarejestrowani w normalny sposób, ale często wygodniejsze jest skonfigurowanie dostawcy opakowującego w czasie wykonywania przez przechwycenie rozpoznawania usług związanych z dostawcą. W tym celu można użyć zdarzenia statycznego OnLockingConfiguration w klasie DbConfiguration.

Funkcja OnLockingConfiguration jest wywoływana po określeniu, skąd zostanie uzyskana cała konfiguracja ef dla domeny aplikacji, ale zanim zostanie zablokowana do użycia. Podczas uruchamiania aplikacji (przed użyciem programu EF) aplikacja powinna zarejestrować program obsługi zdarzeń dla tego zdarzenia. (Rozważamy dodanie obsługi rejestrowania tej procedury obsługi w pliku konfiguracji, ale nie jest to jeszcze obsługiwane). Procedura obsługi zdarzeń powinna następnie wywołać metodę ReplaceService dla każdej usługi, która musi zostać opakowana.

Na przykład w celu opakowania elementów IDbConnectionFactory i DbProviderService należy zarejestrować procedurę obsługi podobną do następującej:

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

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

Usługa, która została rozwiązana i powinna być teraz opakowana razem z kluczem, który został użyty do rozpoznania usługi, jest przekazywany do programu obsługi. Program obsługi może następnie opakowować tę usługę i zastąpić zwróconą usługę opakowaną wersją.

Rozpoznawanie dbProviderFactory za pomocą platformy EF

DbProviderFactory jest jednym z podstawowych typów dostawców wymaganych przez program EF zgodnie z opisem w sekcji Omówienie typów dostawców powyżej. Jak już wspomniano, nie jest to typ ef i rejestracja zwykle nie jest częścią konfiguracji ef, ale jest zamiast tego normalną rejestracją dostawcy ADO.NET w pliku machine.config i/lub pliku konfiguracji aplikacji.

Pomimo tego programu EF nadal używa normalnego mechanizmu rozwiązywania zależności podczas wyszukiwania elementu DbProviderFactory do użycia. Domyślny program rozpoznawania używa normalnej rejestracji ADO.NET w plikach konfiguracji, dlatego jest to zwykle przezroczyste. Jednak ze względu na normalny mechanizm rozwiązywania zależności jest używany oznacza to, że element IDbDependencyResolver może służyć do rozpoznawania elementu DbProviderFactory nawet wtedy, gdy nie wykonano normalnej rejestracji ADO.NET.

Rozwiązanie DbProviderFactory w ten sposób ma kilka konsekwencji:

  • Aplikacja korzystająca z konfiguracji opartej na kodzie może dodawać wywołania w swojej klasie DbConfiguration, aby zarejestrować odpowiedni element DbProviderFactory. Jest to szczególnie przydatne w przypadku aplikacji, które nie chcą (lub nie mogą) korzystać z żadnej konfiguracji opartej na plikach.
  • Usługę można opakować lub zastąpić za pomocą metody ReplaceService, zgodnie z opisem w powyższej sekcji Dostawcy opakowujący
  • Teoretycznie implementacja DbProviderServices może rozwiązać problem z elementem DbProviderFactory.

Ważnym punktem, który należy zwrócić uwagę na wykonywanie dowolnej z tych czynności, jest to, że będą one miały wpływ tylko na wyszukiwanie DbProviderFactory firmy EF. Inny kod inny niż EF może nadal oczekiwać, że dostawca ADO.NET zostanie zarejestrowany w normalny sposób i może zakończyć się niepowodzeniem, jeśli rejestracja nie zostanie znaleziona. Z tego powodu zwykle lepiej jest zarejestrować element DbProviderFactory w normalny ADO.NET sposób.

Jeśli program EF jest używany do rozpoznawania elementu DbProviderFactory, należy również rozpoznać usługi IProviderInvariantName i IDbProviderFactoryResolver.

IProviderInvariantName to usługa używana do określania niezmiennej nazwy dostawcy dla danego typu DbProviderFactory. Domyślna implementacja tej usługi używa rejestracji dostawcy ADO.NET. Oznacza to, że jeśli dostawca ADO.NET nie jest zarejestrowany w normalny sposób, ponieważ dostawca DbProviderFactory jest rozpoznawany przez platformę EF, konieczne będzie również rozwiązanie tej usługi. Należy pamiętać, że program rozpoznawania nazw dla tej usługi jest automatycznie dodawany podczas korzystania z metody DbConfiguration.SetProviderFactory.

Zgodnie z opisem w sekcji Przegląd typów dostawców powyżej element IDbProviderFactoryResolver służy do uzyskiwania poprawnego elementu DbProviderFactory z danego obiektu DbConnection. Domyślna implementacja tej usługi podczas uruchamiania na platformie .NET 4 używa rejestracji dostawcy ADO.NET. Oznacza to, że jeśli dostawca ADO.NET nie jest zarejestrowany w normalny sposób, ponieważ dostawca DbProviderFactory jest rozpoznawany przez platformę EF, konieczne będzie również rozwiązanie tej usługi.