实体框架6.2不应自动获取我的自定义DbConfiguration

时间:2020-08-20 11:10:49

标签: c# entity-framework-6

我想通过单个集成测试来启用显式的SQL日志记录,而无需更改DbContext定义

我所拥有的:具有多个DbContext的10多个项目。 10多个测试项目。许多其他集成测试也使用EF

我尝试过的事情:

internal class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration(StreamWriter sw)
    {
        var interceptor = new DatabaseLogFormatter(s => { sw.WriteLine(s); });

        AddInterceptor(interceptor );
    }
}

通过运行此代码,开始在我的计算机上运行 explicit 的一项集成测试

        var dbConfiguration = new MyDbConfiguration(fileStream);

        DbConfiguration.SetConfiguration(dbConfiguration);

这很好。一次测试是记录所有EF SQL

但是,当我运行完整的测试套件(没有一个测试并且没有SetConfiguration)时,EF将(直到很晚)获取MyDbConfiguration并抛出异常

System.InvalidOperationException:在发现“ MyDbConfiguration”类型之前,实体框架已使用默认的DbConfiguration实例

如何防止这种情况?我无法更改任何app.configs

我希望EF仅在配置时使用MyDbConfiguration。

1 个答案:

答案 0 :(得分:2)

如果您不希望Entity Framework自动检测并获取自定义DbConfiguration,则可以找到一种绕过自动检测规则的方法。

默认情况下(没有任何其他自定义配置),DbConfigurationFinder中的Entity Frameworksource code)在与{ {1}}派生类被声明。

由于您不能更改任何DbConfiguration文件,因此,一种方法是通过在单独的程序集中声明DbContext派生类,而不是持有.config的类。
由于将其用于集成测试目的,因此可以将其放入该测试项目中。