EF6 CLI 工具无法从用户机密 .net 核心读取连接字符串

问题描述

我们有一个使用 EF6 的旧系统。像许多人一样,我们已经转向 .Net Core,但发现 EFCore 在我们现有系统中需要的所有功能中都有些欠缺。考虑到这一点,我们目前正在 .Net 核心解决方案中使用 EF6。

到目前为止,我们较新的基于 .Net Core 的系统只有对现有数据库的读写权限,与较旧的 .Net 框架解决方案共享实体配置。我们现有的流程依赖于将迁移更改应用于数据库的 .Net Framework 应用程序。然后,我们的 .Net 核心应用程序能够通过与 .Net 框架项目共享实体和配置来与数据库交互。到目前为止,这对我们来说效果很好,但是,我们现在需要能够将迁移从新的 .Net 核心项目应用到新数据库

我们大量使用 .Net 核心的一些新功能包括使用用户机密,但我们发现当我们在开发过程中尝试将迁移应用到本地数据库时,这会导致问题,因为这似乎总是认的当我们通过包管理器控制台使用 EF6 CLI 工具时到本地数据库

我们创建了一个简单的上下文工厂,它通过选项模式接收应用设置,并在创建时使用其中的值将连接字符串传递到上下文中,但是,在运行 EF6 CLI 工具时,选项始终为空。

public class MyContextFactory : IDbContextFactory<MyContext>
{
    private readonly IOptions<ConnectionStrings> _settings;

    public MyContextFactory(IOptions<ConnectionStrings> settings)
    {
        _settings = settings;
    }

    public MyContext Create()
    {
        return new MyContext(_settings.Value.MyConnectionString);
    }
}

我相信这是因为 EF6 工具只运行上下文工厂类,但这不是在应用开发环境设置的情况下完成的,因此在检索选项时它返回空,因为我们的 appsettings 中的相关 json 字段为空(这这是我们的开发惯例,因为我们从不将机密保存到我们的存储库中)。

为了测试这个理论,我将我们的连接字符串直接添加到应用设置中。虽然这不会产生我们之前收到的空引用异常错误,但它确实产生了一个关于缺少无参数构造函数的新错误

上下文工厂类型'MyProject.Data.Ef6.Context.MyContextFactory' 没有公共无参数构造函数。要么添加公共 无参数构造函数,创建一个 IDbContextFactory 实现 在上下文程序集中,或使用注册上下文工厂 数据库配置。

如果我添加一个无参数的构造函数,尽管我看到的是相同的

未将对象引用设置为对象的实例。

错误如前。

EFCore 不是一个选项,那么我们如何调整我们的项目,以便我们可以执行本地数据库迁移,而不必在我们的上下文工厂或我们的上下文本身中硬编码任何连接字符串?

我们不太关心我们的生产环境,因为我们手动将向上和向下迁移应用于这些环境,因此会关闭自动迁移,但我们希望以一种防止开发人员意外将我们的连接字符串提交到代码库。

提前致谢。

我可以提供所需的任何进一步信息。

编辑:

上下文在startup.cs中设置如下:

services.AddTransient<IVehicleLookupContext>(_ => new MyContext(Configuration.GetConnectionString("MyConnectionString")));

startup.cs 中的选项设置如下:

services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));

连接字符串存储在 appsettings.json 中,但在 repo 中为空。它仅由用户计算机上的用户机密填充,因此不会将连接字符串写入存储库。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)