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