Pau*_*els 6 .net entity-framework-6 asp.net-core asp.net-core-2.0 .net-4.7
我正在尝试从新的Asp Net Core 2.0 Web应用程序调用.Net 4.7数据访问库(使用Entity Framework 6).
问题是EF6似乎无法获得DbProviderFactory.我的工作理论是,这应该是在调用程序的app/web.config中提供的.我得到的错误是:
System.TypeLoadException:'无法从程序集'System.Data,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'加载类型'System.Data.Common.DbProviderFactories'.'
为了解决这个问题,我创建了一个DbConfiguration类:
public class MyDbConfiguration : DbConfiguration
{
public MyDbConfiguration()
{
SetProviderFactory("System.Data.SqlClient", System.Data.SqlClient.SqlClientFactory.Instance);
SetProviderServices("System.Data.SqlClient", SqlProviderServices.Instance);
}
}
[DbConfigurationType(typeof(MyDbConfiguration))]
public class MyDbContext : DbContext, IMyDbContext
{
public MyDbContext(string connectionString)
: base(connectionString)
{
}
Run Code Online (Sandbox Code Playgroud)
断点显示它正确执行MyDbConfiguration,但仍然抛出错误.我已经在.Net Core Web应用程序上安装了System.Data.SqlClient和System.Data.Common包.
我没有发现任何明确说明我想要做的事情(一般)是不可能的,所以我正在假设我的DBConfiguration实现有问题.请有人指出我正确的方向吗?
如果您想使用 .Net Core 应用程序中的实体框架库,您应该针对 .Net Framework 重新定位应用程序。以下是来自官方消息来源的引用:
要使用 Entity Framework 6,您的项目必须针对 .NET Framework 进行编译,因为 Entity Framework 6 不支持 .NET Core。如果您需要跨平台功能,则需要升级到Entity Framework Core。
如果您检查 .Net .Core 项目的示例(从同一文档链接),该项目使用 EF6 库(正是您的情况),您将看到它的目标是 .Net Framework,而不是 .Net Core:
<TargetFramework>net452</TargetFramework>
Run Code Online (Sandbox Code Playgroud)
进行此类重定向时,您不会丢失当前正在使用的任何 .Net Core 功能。您仍然可以在 .Net Core 中使用我们喜欢的所有美味的东西。但是,您将应用程序启动的平台限制为仅 .Net Framework。不幸的是,当前无法解决此限制,因为它是由于实体框架仅针对 .Net Framework 实现的事实造成的。您的选择是转向 Entity Framework Core,或者等到 Entity Framework成为.Net Standard 的一部分。
总之,要解决当前问题,请更改 .Net Core csproj 文件中的以下行:
<TargetFramework>netcoreapp2.0</TargetFramework>
Run Code Online (Sandbox Code Playgroud)
到
<TargetFramework>net47</TargetFramework>
Run Code Online (Sandbox Code Playgroud)