C# 如何防止DbModelBuilder构建的数据库模型连接到数据库?

C# 如何防止DbModelBuilder构建的数据库模型连接到数据库?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我需要使用SQLServerDbContext对表达式的支持进行单元测试。我很幸运地找到了亚瑟·维克斯(Arthur Vickers)提供的信息丰富的答案。不幸的是,我在实现上遇到了一些问题 我创建了一个简单的测试应用程序,其中包含从数据库自动生成的DbContext(我只添加了一个以DbCompiledModel为参数的构造函数): 下次当我执行代码时,这个实体被打印出来了。SQL Server Management Studio在旧数据库中看不到任何新数据库或此实体,并且context.Da

我需要使用SQLServer
DbContext
对表达式的支持进行单元测试。我很幸运地找到了亚瑟·维克斯(Arthur Vickers)提供的信息丰富的答案。不幸的是,我在实现上遇到了一些问题

我创建了一个简单的测试应用程序,其中包含从数据库自动生成的
DbContext
(我只添加了一个以
DbCompiledModel
为参数的构造函数):

下次当我执行代码时,这个实体被打印出来了。SQL Server Management Studio在旧数据库中看不到任何新数据库或此实体,并且
context.Database.Connection.Database
是一个空字符串,因此看起来实体框架使用空名称创建了一个数据库(甚至可能吗?)并向其写入数据

那个么,有什么方法可以防止上下文连接到数据库或创建新的数据库呢?我的目标是在不连接数据库的情况下至少运行
context.Foos.Where(expression).ToList()
,并查看是否会出现异常,因为表达式无法转换为SQL查询

非常感谢你的回答

这是我的
app.config
文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" 
                 type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
                  requirePermission="false" />
    </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
            <parameters>
                <parameter value="mssqllocaldb" />
            </parameters>
        </defaultConnectionFactory>
        <providers>
            <provider invariantName="System.Data.SqlClient" 
                      type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
    <connectionStrings>
        <add name="TestDbContext" 
             connectionString="data source=INSPIRON;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" 
             providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

所以,看起来我误解了中提出的测试方法。我做了一些实验,发现使用
foreach
迭代
context.Foos.Where(expression)
,调用
context.Foos.Where(expression).ToString()
将使实体框架检查
expression
是否能够将其转换为SQL查询,并在数据库不存在时创建数据库

但打电话之后:

Database.SetInitializer<TestDbContext>(null);
Database.SetInitializer(null);
context.Foos.Where(expression).ToString()仍将检查
expression
,如果
expression
不正确,则抛出异常,但不会创建数据库。使用
foreach
迭代
context.Foos.Where(expression)
,即使使用正确的
expression
也会引发异常,因为无法创建数据库

所以,是的,可以测试Entity Framework是否支持
表达式
,而无需实际创建数据库或连接到现有数据库,但这只能通过调用“ToString()”(返回SQL查询或引发异常)来完成。尝试使用
foreach
遍历实体无论如何都会连接到数据库或抛出异常,因此不适合这种测试。这是我的错误

也许,所有这些都是显而易见的,但对我来说不是,所以,我希望,我的回答可能会对处于同样情况的人有所帮助

context.Foos.Add(new Foo() { Name = "Bar" });
context.SaveChanges()
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" 
                 type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
                  requirePermission="false" />
    </configSections>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
            <parameters>
                <parameter value="mssqllocaldb" />
            </parameters>
        </defaultConnectionFactory>
        <providers>
            <provider invariantName="System.Data.SqlClient" 
                      type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
        </providers>
    </entityFramework>
    <connectionStrings>
        <add name="TestDbContext" 
             connectionString="data source=INSPIRON;initial catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" 
             providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>
Database.SetInitializer<TestDbContext>(null);