我一直在使用Entity Framework CTP和Code-First一样,如Scott this tutorial和另一个Scott Hanselman(不能发布链接,但google“Simple Code First with Entity Framework 4 - Magic Unicorn功能CTP 4“)。这对于主要的MVC应用程序非常有效,但我现在正在尝试添加一个使用单独的SQL CE数据库的测试项目。
我已将以下内容添加到App.Config文件中:
<connectionStrings>
<add name="MyData"
connectionString="Data Source=D:\myProject\myDb.sdf;"
providerName="System.Data.SqlServerCe.4.0" />
</connectionStrings>
但是,当我尝试运行测试时,它会在尝试创建数据库时抛出以下错误:
测试方法 MyProjet.Tests.Administration.ModlelTests.Business.TestGetBusinessesList 抛出异常: System.Reflection.TargetInvocationException: 例外已被抛出 调用的目标。 ---&GT; System.TypeInitializationException: 类型初始值设定项 'System.Data.SqlServerCe.SqlCeProviderServices' 抛出一个例外。 ---&GT; System.Security.VerificationException: 行动可能破坏稳定 运行时。
使用以下堆栈跟踪:
System.Data.SqlServerCe.SqlCeProviderServices..ctor() System.Data.SqlServerCe.SqlCeProviderServices..cctor() System.RuntimeFieldHandle.GetValue(RtFieldInfo field,Object instance,RuntimeType fieldType,RuntimeType declaringType, 布尔和放大器; domainInitialized) System.Reflection.RtFieldInfo.InternalGetValue(对象 obj,布尔值doVisibilityCheck, Boolean doCheckConsistency) System.Reflection.RtFieldInfo.InternalGetValue(对象 obj,布尔值doVisibilityCheck) System.Reflection.RtFieldInfo.GetValue(对象 OBJ) System.Data.SqlServerCe.ExtensionMethods.SystemDataSqlServerCeSqlCeProviderServices_Instance_GetValue() System.Data.SqlServerCe.ExtensionMethods.SystemDataSqlServerCeSqlCeProviderServices_Instance() System.Data.SqlServerCe.SqlCeProviderFactory.System.IServiceProvider.GetService(类型 服务类型) System.Data.Common.DbProviderServices.GetProviderServices(DbProviderFactory 厂) System.Data.Common.DbProviderServices.GetProviderServices(的DbConnection 连接) System.Data.Entity.ModelConfiguration.Internal.Configuration.CodeFirstCachedMetadataWorkspace.GetMetadataWorkspace(的DbConnection storeConnection) System.Data.Entity.Infrastructure.DbModel.CreateObjectContext [TContext](的DbConnection existingConnection) System.Data.Entity.Internal.LazyInternalContext.InitializeFromModel(DbModel之后, 模型) System.Data.Entity.Internal.LazyInternalContext.InitializeContext() System.Data.Entity.Internal.InternalContext.Initialize() System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(类型 的EntityType) System.Data.Entity.Internal.Linq.EfInternalQuery
1.Initialize() System.Data.Entity.Internal.Linq.EfInternalQuery
1.Include(字符串 路径) System.Data.Entity.Infrastructure.DbQuery`1.Include(字符串 路径) MyProjet.Areas.Administration.Models.BusinessModel.GetBusinesses() 在 d:\ projects2010 \ MyProjet \ MyProjet \区\管理\型号\ BusinessModel.cs: 第47行 MyProjet.Tests.Administration.ModlelTests.Business.TestGetBusinessesList() 在 d:\ projects2010 \ MyProjet \ MyProjet.Tests \管理\ ModlelTests \ Business.cs: 第45行
我已经尝试替换MVC应用程序中现有的MyData连接字符串,但它工作正常。当它添加到Testing项目时,它只会导致此问题。此外,当指向SQL或SQL Express数据库时,测试项目可以正常运行。
现在已经挣扎了一段时间,但是无法理解。我确信我忽略了一些简单的事情。
答案 0 :(得分:4)
尝试使用
Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
请参阅我的博文,了解示例http://www.arrangeactassert.com/code-first-entity-framework-unit-test-examples/
答案 1 :(得分:0)
我一直在内置Microsoft测试框架下运行测试。将测试框架更改为NUnit(如Jag的教程中)已解决了这个问题。
看起来SqlServerCe和Visual Studio Unit Testing Framework之间存在冲突。