我听说在测试 EF 时,您需要对实时数据库使用集成测试,因为 LINQ to Objects 和 LINQ to Entities 提供程序之间存在差异。
为什么我们不能在不实际执行的情况下对查询的构造进行单元测试?我原以为您可以以某种方式将您的 IQueryable 附加到 LINQ to Entities 提供程序并确认 SQL 已正确生成(使用不执行实际查询的 ToTraceString 之类的东西)。
我想像这些行的代码(此查询在 L2O 中运行良好,但在 L2E 中运行良好):
<Test()> _
Public Sub Query_Should_Build_Against_L2E()
Dim testQuery = From d In myDb
Where d.Status = CType(Status.Ready, Integer)
testQuery.SetQueryProvider("L2E")
Assert.DoesNotThrow(testQuery.ToTraceString())
End Sub
编辑
我尝试按如下方式实施 GertArnold 的解决方案:
Dim context As New Context("Data Source=fakedbserver;Initial Catalog=fakedb;Persist Security Info=True;")
Dim result = context.myTable.Where(Function(d) d.Status=True)
这会引发一条ProviderIncompatibleException
消息“从数据库获取提供程序信息时发生错误。这可能是由 Entity Framework 使用不正确的连接字符串引起的。请检查内部异常以获取详细信息并确保连接字符串正确。” 这是完整的异常链:
System.Data.ProviderIncompatibleException :从数据库获取提供程序信息时出错。这可能是由 Entity Framework 使用不正确的连接字符串引起的。检查内部异常以获取详细信息并确保连接字符串正确。
System.Data.ProviderIncompatibleException :提供程序未返回 ProviderManifestToken 字符串。
System.InvalidOperationException :此操作需要连接到“主”数据库。无法创建到“主”数据库的连接,因为原始数据库连接已打开并且凭据已从连接字符串中删除。提供一个未打开的连接。
System.Data.SqlClient.SqlException :建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)