是否可以使用 .NET 5 Blazor 应用程序中的 Entity Framework 6 引用 .NET Framework 库?
Is it possible to reference a .NET Framework Library using Entity Framework 6 from a .NET 5 Blazor App?
我们有几个较旧的 class 库,它们以 .NET Framework 4.8 为目标并使用 Entity Framework 6.
我们还计划构建一个全新的应用程序,并且有兴趣将 .NET 5 与 Blazor 一起使用,但不确定我们是否可以成功引用和利用这些库。
我在我的 Blazor 应用程序中添加了对旧项目的引用,并且还引用了 Entity Framework 6. 我将 DBContext 添加到 ConfigureServices 方法中,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<MyDBContext>(); // reference to my EF6 DB Context
}
我还向 appsettings.json 添加了连接字符串,如下所示:
"ConnectionStrings": {
"MyConnectionString": "XXXXXXXXXXXXXXXXXXXXX" // connection details ommitted
}
当我尝试 运行 应用程序并使用引用数据库的代码时,我收到以下错误:
No connection string named 'MyConnectionString' could be found in the
application config file.
这看起来很奇怪,因为 appsettings.json 文件中的连接字符串 是 。
所以,我只是在某个地方犯了一个愚蠢的错误,还是我在尝试做一些不可能的事情?
不,这不是一个有效的场景; .NET Core / .NET 5 从未提供直接与 .NET Framework 程序集对话的能力,而 blazor 极大地加剧了这一点。有时,这种参考有点管用,但不受支持 - 甚至 .NET Framework 上的 .NET Standard 支持也是时好时坏,有很多 hack。
基本上,您需要更新旧库以针对相同的运行时。或者你 可能 能够从旧库中以 .NET Standard 2.0 为目标,如果它们也需要在 .NET Framework 上工作,但老实说:milti-target 两个 net48 通常工作较少和 net5 在同一个 csproj 中,而不是处理损坏的 .NET Standard 黑客和丢失的 API。不幸的是,EF6 没有 .NET Core / .NET 5 直接翻译;迁移到 EF Core 将需要更改代码和测试。
EF 6.3+ supports .NET Standard 2.1 and .NET 5 targets .NET Standard 2.1.
但是,如果您有针对 .NET Framework 的自定义程序集,您需要将它们重新编译为针对 .NET Standard 2.1,然后才能在 .NET 5 中使用它们。这应该很简单,除非您依赖于其他库尚未移植到 .NET Standard/.NET Core。
但 EF6 无法自行找到连接字符串。您需要访问配置并将连接字符串传递给 DbContext,如本例所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddScoped<MyDBContext>(_ =>
new SchoolContext(Configuration.GetConnectionString("MyConnectionString")));
}
我们有几个较旧的 class 库,它们以 .NET Framework 4.8 为目标并使用 Entity Framework 6.
我们还计划构建一个全新的应用程序,并且有兴趣将 .NET 5 与 Blazor 一起使用,但不确定我们是否可以成功引用和利用这些库。
我在我的 Blazor 应用程序中添加了对旧项目的引用,并且还引用了 Entity Framework 6. 我将 DBContext 添加到 ConfigureServices 方法中,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddServerSideBlazor();
services.AddScoped<MyDBContext>(); // reference to my EF6 DB Context
}
我还向 appsettings.json 添加了连接字符串,如下所示:
"ConnectionStrings": {
"MyConnectionString": "XXXXXXXXXXXXXXXXXXXXX" // connection details ommitted
}
当我尝试 运行 应用程序并使用引用数据库的代码时,我收到以下错误:
No connection string named 'MyConnectionString' could be found in the application config file.
这看起来很奇怪,因为 appsettings.json 文件中的连接字符串 是 。
所以,我只是在某个地方犯了一个愚蠢的错误,还是我在尝试做一些不可能的事情?
不,这不是一个有效的场景; .NET Core / .NET 5 从未提供直接与 .NET Framework 程序集对话的能力,而 blazor 极大地加剧了这一点。有时,这种参考有点管用,但不受支持 - 甚至 .NET Framework 上的 .NET Standard 支持也是时好时坏,有很多 hack。
基本上,您需要更新旧库以针对相同的运行时。或者你 可能 能够从旧库中以 .NET Standard 2.0 为目标,如果它们也需要在 .NET Framework 上工作,但老实说:milti-target 两个 net48 通常工作较少和 net5 在同一个 csproj 中,而不是处理损坏的 .NET Standard 黑客和丢失的 API。不幸的是,EF6 没有 .NET Core / .NET 5 直接翻译;迁移到 EF Core 将需要更改代码和测试。
EF 6.3+ supports .NET Standard 2.1 and .NET 5 targets .NET Standard 2.1.
但是,如果您有针对 .NET Framework 的自定义程序集,您需要将它们重新编译为针对 .NET Standard 2.1,然后才能在 .NET 5 中使用它们。这应该很简单,除非您依赖于其他库尚未移植到 .NET Standard/.NET Core。
但 EF6 无法自行找到连接字符串。您需要访问配置并将连接字符串传递给 DbContext,如本例所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddScoped<MyDBContext>(_ =>
new SchoolContext(Configuration.GetConnectionString("MyConnectionString")));
}