我们有一个使用 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 实现,或使用 DbConfiguration 注册上下文工厂。
如果我添加了一个无参数的构造函数,尽管我看到的是相同的
你调用的对象是空的。
和以前一样的错误。
EFCore 不是一个选项,那么我们如何调整我们的项目,以便我们可以执行本地数据库迁移,而不必在我们的上下文工厂或我们的上下文本身中硬编码任何连接字符串?
我们不太关心我们的生产环境,因为我们手动将向上和向下迁移应用到这些环境,因此将关闭自动迁移,但我们希望以防止开发人员意外将我们的连接字符串提交到代码库的方式进行设置。
提前致谢。
我可以提供所需的任何进一步信息。
编辑:
上下文在 startup.cs 中设置如下:
services.AddTransient<IVehicleLookupContext>(_ => new MyContext(Configuration.GetConnectionString("MyConnectionString")));
在 startup.cs 中设置选项如下:
services.Configure<ConnectionStrings>(Configuration.GetSection("ConnectionStrings"));
连接字符串存储在 appsettings.json 中,但在 repo 中为空白。它仅由用户计算机上的用户秘密填充,因此不会将连接字符串写入存储库。