我正在使用带有Asp.net核心的EF6,通过dbcontext调用db时出现错误:
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
答案 0 :(得分:4)
错误Unable to determine the provider name...
可能表明Core项目的.csproj
根据Get Started with ASP.NET Core and Entity Framework 6上的说明未正确设置。
就我而言,我正在与Core 2.2项目一起工作,并尝试利用.Net Framework 4.7.1类库中的Entity Framework 6,但未能将Core .csproj
文件从<TargetFramework>netcoreapp2.2</TargetFramework>
更改为{ {1}}。
当我最终更改目标框架时,下一个出现的错误是<TargetFramework>net471</TargetFramework>
。我删除了NuGet Microsoft.AspNetCore.All 2.2.1 is not compatible with net471 (.NETFramework,Version=v4.7.1)
程序包,然后创建了很多缺少的参考构建错误。
要解决构建错误,我必须用谷歌搜索缺少的类型以找到程序集名称,添加特定的NuGet程序包,进行重建,然后继续重复此过程,直到解决所有构建错误为止。
每个项目都是不同的,但是在删除Microsoft.AspNetCore.All
之后,这里是我为解决构建问题而不得不添加的软件包:
Microsoft.AspNetCore.All
在解决了构建问题并成功构建了项目之后,我的DotNet Core 2.2 API能够使用Entity Framework 6从类库项目中返回数据。
总而言之,发生<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" />
的原因是,实体框架的DotNet Core版本而不是.NET Framework 4.7.1版本正在访问生成的Entity Framework类(在.NET Framework 471类库中)。实体框架。
在进行上面列出的更改之前,在立即调试窗口中评估System.NotSupportedException
会显示提供程序为空集合。进行更改后,工厂类包括Odbc,OleDb,Oracle,SqlServer提供程序。
更具体地说,如果您分别评估行,则应该看到提供程序来自完整的.NET Framework。
例如:System.Data.Common.DbProviderFactories.GetFactoryClasses().Rows
(对我来说)表明它来自System.Data.Common.DbProviderFactories.GetFactoryClasses().Rows[3].ItemArray
。
答案 1 :(得分:1)
如先前答案所述:实体框架6不支持.NET Core。如果您需要跨平台功能,则需要升级到Entity Framework Core。
对于.Net Core项目,您可以尝试NHibernate。