System.NotSupportedException: невозможно определить имя поставщика для фабрики поставщиков типа 'System.Data.SqlClient.SqlClientFactory' - PullRequest
0 голосов
/ 05 сентября 2018

Я использую EF6 с ядром Asp.net и получаю сообщение об ошибке при обращении к db через dbcontext:

System.NotSupportedException: Unable to determine the provider name for provider factory of type 'System.Data.SqlClient.SqlClientFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.
   at System.Data.Entity.Utilities.DbProviderFactoryExtensions.GetProviderInvariantName(DbProviderFactory factory)
   at System.Data.Entity.Infrastructure.DependencyResolution.DefaultInvariantNameResolver.GetService(Type type, Object key)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at System.Linq.Enumerable.SelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Func`2 predicate, Boolean& found)
   at System.Data.Entity.Infrastructure.DependencyResolution.ResolverChain.GetService(Type type, Object key)
   at System.Linq.Enumerable.SelectArrayIterator`2.MoveNext()
   at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Func`2 predicate, Boolean& found)
   at System.Data.Entity.Infrastructure.DependencyResolution.ResolverChain.GetService(Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.CompositeResolver`2.GetService(Type type, Object key)
   at System.Data.Entity.Infrastructure.DependencyResolution.DbDependencyResolverExtensions.GetService[T](IDbDependencyResolver resolver, Object key)
   at System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInvariantName(DbConnection connection)
   at System.Data.Entity.Internal.InternalConnection.get_ProviderName()
   at System.Data.Entity.Internal.DefaultModelCacheKeyFactory.Create(DbContext context)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.Initialize()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
   at CoreWithEF.controllers.SampleController.GetStudentDetails() in C:\Users\biradm1\Documents\Visual Studio 2017\Projects\CoreWithEF\CoreWithEF\controllers\SampleController.cs:line 27
   at lambda_method(Closure , Object , Object[] )
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()}  System.NotSupportedException

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Как указано в предыдущем ответе: Entity Framework 6 не поддерживает .NET Core. Если вам нужны кроссплатформенные функции, вам нужно обновить до Entity Framework Core .

Вы можете попробовать NHibernate для проектов .Net Core.

0 голосов
/ 09 января 2019

Ошибка Unable to determine the provider name... может указывать на то, что .csproj для основного проекта неправильно установлен согласно инструкциям на Начало работы с ASP.NET Core и Entity Framework 6 .

В моем случае я работал с проектом Core 2.2 и пытался использовать Entity Framework 6 из библиотеки классов .Net Framework 4.7.1, но не смог изменить файл Core .csproj с <TargetFramework>netcoreapp2.2</TargetFramework> на <TargetFramework>net471</TargetFramework>.

Когда я наконец-то изменил целевую платформу, появилась следующая ошибка: Microsoft.AspNetCore.All 2.2.1 is not compatible with net471 (.NETFramework,Version=v4.7.1). Я удалил пакет NuGet Microsoft.AspNetCore.All, который затем создал много пропущенных ошибок при сборке ссылок.

Чтобы устранить ошибки сборки, мне пришлось погуглить отсутствующий тип, чтобы найти имя сборки, добавить этот конкретный пакет NuGet, перестроить, а затем повторять процесс до тех пор, пока все ошибки сборки не будут устранены.

Каждый проект индивидуален, но здесь были пакеты, которые мне пришлось добавить, чтобы исправить проблемы со сборкой после удаления Microsoft.AspNetCore.All:

<PackageReference Include="EntityFramework" Version="6.2.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.HttpsPolicy" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="4.5.0" />

После того, как проблемы со сборкой были решены и проект был успешно собран, мой API DotNet Core 2.2 смог вернуть данные с помощью Entity Framework 6 из проекта библиотеки классов.


Подводя итог, можно сказать, что System.NotSupportedException произошел из-за того, что сгенерированные классы Entity Framework (в библиотеке классов .NET Framework 471) были доступны для версии Entity Framework DotNet Core, а не для версии Entity .NET Framework 4.7.1. Framework.

Перед внесением изменений, перечисленных выше, оценка System.Data.Common.DbProviderFactories.GetFactoryClasses().Rows в окне немедленной отладки показала пустую коллекцию провайдеров. После внесения изменений в фабричные классы были включены поставщики Odbc, OleDb, Oracle, SqlServer.

Более конкретно, если вы оцениваете строки по отдельности, вы должны увидеть, что провайдеры взяты из Full .NET Framework.

Например: System.Data.Common.DbProviderFactories.GetFactoryClasses().Rows[3].ItemArray (для меня) показал, что оно пришло от "System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...