无法解析 Microsoft.EntityFrameworkCore.Diagnostics.IDiagnosticsLogger 类型的服务

Muz*_*zib 9 mysql entity-framework-core

我在使用 EF core 构建现有 MySQL 数据库时遇到困难。我已经添加了oracle 文档中提到的所需依赖项:

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkcore.Tools" Version="6.0.0">
Run Code Online (Sandbox Code Playgroud)

然后,我在包管理器控制台中运行此代码:

Scaffold-Dbcontext "server=the.server.ip.address;user=user_name;database=db_name;password=db_password;port=3306" MySql.EntityFrameworkCore -o Data -v
Run Code Online (Sandbox Code Playgroud)

它显示此错误:

尝试激活“MySql.EntityFrameworkCore.Scaffolding.Internal.MySQLDatabaseModelFactory”时无法解析类型“Microsoft.EntityFrameworkCore.Diagnostics.IDiagnosticsLogger`1[Microsoft.EntityFrameworkCore.DbLoggerCategory+Scaffolding]”的服务

以下是输出窗口中的相关日志:

Finding design-time services referenced by assembly 'Test2'...
Finding design-time services referenced by assembly 'Test2'...
No referenced design-time services were found.
Finding design-time services for provider 'MySql.EntityFrameworkCore'...
Using design-time services from provider 'MySql.EntityFrameworkCore'.
Finding IDesignTimeServices implementations in assembly 'Test2'...
No design-time services were found.
Run Code Online (Sandbox Code Playgroud)

我不知道如何实现设计时类,也没有在网络上找到任何有用的链接。

请注意,我可以使用 MySQL Workbench 访问数据库并运行查询。

MDa*_*ave 15

我不是在搭建脚手架时遇到此错误,而是在尝试创建第一次迁移时遇到此错误。我不想降级到 5.0,因为它必须是永久性的,因为我要进行大量迁移。

我通过将提供商从 更改为MySql.Data.EntityFrameworkCore来修复此问题Pomelo.EntityFrameworkCore.MySql

  1. 从我的 API 和 DAL 项目中删除旧的提供程序:

    dotnet remove package MySql.EntityFrameworkCore

  2. 添加 Pomelo 提供商

    dotnet add package Pomelo.EntityFrameworkCore.MySql

  3. 更新您的启动以使用 Pomelos 配置:

    https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql#2-services-configuration

  4. 迁移正在进行中:

    dotnet ef migrations add InitialCreate

  • 谢谢。另外,甲骨文过去已经失败过很多次了,所以我将转向 Pomelo。Oracle 是唯一一个在 .net 方面给我带来很多麻烦的供应商(oci 驱动程序、MySQL 驱动程序等) (3认同)

小智 9

根据这个描述 https://bugs.mysql.com/bug.php?id=106592

您可以通过将以下类添加到代码中来解决此错误

public class MysqlEntityFrameworkDesignTimeServices : IDesignTimeServices
{
    public void ConfigureDesignTimeServices(IServiceCollection serviceCollection)
    {
        serviceCollection.AddEntityFrameworkMySQL();
        new EntityFrameworkRelationalDesignServicesBuilder(serviceCollection)
            .TryAddCoreServices();
    }
}
Run Code Online (Sandbox Code Playgroud)

定义后,您必须将其添加为启动文件中的服务,如下所示

services.AddSingleton<IDesignTimeServices, MysqlEntityFrameworkDesignTimeServices>();
Run Code Online (Sandbox Code Playgroud)

完成这些步骤后,您可以迁移代码:)

  • 这是最好的答案。降级是最糟糕的答案,因为 Microsoft 对于让您再安装 .NET 5 非常挑剔。我尝试将它安装到 Linux,但它不再在存储库中,必须手动安装。 (2认同)

小智 6

我在尝试构建现有 MySQL 数据库时遇到了同样的问题。看起来最新版本的MySql.EntityFrameworkCore (6.0.0-preview3.1) 仍然使用 EFCore 5.0 库,并且尚未更新到 EFCore 6.0。

Microsoft.EntityFrameworkCore.Diagnostics似乎最后在 EFCore 5 中实现,并在 6 中删除。

当我将所有软件包降级到 5 版本级别时,我能够运行脚手架命令而不会出现该错误。

  • 无需降级。看看下面MDave的答案,看起来MySql提供程序有bug。Pomelo 提供程序确实有效,并且在查看 nuget.org 上的下载计数时似乎是更受欢迎的选择。 (2认同)

Ank*_*ain 6

为了Scaffold-Dbcontext工作,我必须将这两个包降级到5.0.0版本。

  • MySql.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Tools

在此输入图像描述

成功搭建脚手架后,我将这些软件包升级回最新版本。