代码优先实体框架 - 创建SQL CE DB时出错

时间:2010-07-27 14:27:46

标签: entity-framework code-first targetinvocationexception

我一直在使用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数据库时,测试项目可以正常运行。

现在已经挣扎了一段时间,但是无法理解。我确信我忽略了一些简单的事情。

2 个答案:

答案 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之间存在冲突。