【发布时间】:2018-09-12 22:26:52
【问题描述】:
我使用 Entity Framework Core 创建了一个库来处理持久性。 它由针对 SQL Server 数据库的 Web API 使用。 此外,我针对 SQLite 数据库对其进行了测试(单元测试)。
我使用配置文件以简单的方式完成了它。因此,在我扩展 DBContext 的类中,我使用类似这样的方式实现了 OnConfiguring:
if(isSqlServer) //don't mind where it comes from, it works fine
optionsBuilder.UseSqlServer(connectionString);
else
optionsBuilder.UseSqlite(connectionString);
它似乎工作正常,但效果不佳。假设我有这个项目:
- 持久层
- PersistenceLayerTests
- WebAPI
由于方法 UseSqlite 是包 Microsoft.EntityFrameworkCore.Sqlite 的类中的静态扩展方法,同样,方法 UseSqlServer 是包 Microsoft.EntityFrameworkCore.SqlServer 的类中的静态扩展方法,有两件事麻烦我。
首先,我必须在三个项目中包含这两个依赖项,以避免在运行时出现错误“System.IO.FileNotFoundException:无法加载文件或程序集 Microsoft.EntityFrameworkCore.SqlServer (...)”。
其次,如果我需要支持一个新的 DBMS(Oracle、MySQL),我必须在三个项目上包含新的依赖项。
我希望构建一个方案,其中 PersistentLayer 项目将没有这些依赖项,而 PersistentLayerTests 将仅依赖于 Microsoft.EntityFrameworkCore.Sqlite,而 WebAPI 将仅依赖于 Microsoft.EntityFrameworkCore.SqlServer。
是否有另一种方法来配置连接上下文以解耦这些包依赖关系?
注意事项:
- 我使用 NHibernate 做到了这一点,它为每个 DBMS 使用不同的驱动程序实现。
- 我尝试使用反射,但并不优雅,而且我注意到如果扩展方法具有不同的参数,它将无法正常工作。
- 我不需要完整的解决方案。如果有人能指出我的另一种方式,那将非常有帮助。
【问题讨论】:
-
看来您需要将db上下文的配置移动到test/web项目中。
-
@ikkentim 可以接受,特别是测试项目。对于 WebAPI,它并不完美,因为我想完全抽象 EF 的使用(但我没有提到这个问题,抱歉)。但我可以轻松地将 WebAPI 项目拆分为 3 个项目来做到这一点。一个项目将拥有所有控制器,第二个项目将只是一个用于配置 NHibernate 的“外壳”,第三个将是另一个“外壳”来配置具有 DBContext 专业化的 EF。
标签: c# .net-core entity-framework-core