2013-11-22 35 views
3

我有一个使用Entity Framework 6POCO code first approach的项目。我有一套我已经包含在我的项目中的类库,以允许重用代码。这些库使用代码合同。使用实体框架,代码优先(POCO)和代码合同运行更新数据库时出现错误

我也启用了Static和Runtime检查我的启动项目。

该项目建立良好,正确执行。当我执行“更新数据库”时,数据库已成功创建。

当我试图在数据库种子化过程中使用代码合同的外部库中调用方法时,出现了我的问题。如果我省略这些功能,它会正确种子。如果我包含一个具有代码合同的函数,那么当我执行“更新数据库”时,我会得到以下内容。需要注意的是生成表结构的SQL正确执行。这只影响播种的SQL

运行种子法。 System.Runtime.Serialization.SerializationException:类型不 解决的成员 'System.Diagnostics.Contracts._ ContractsRuntime + ContractException + ContractExceptionData,WebForms的, 版本= 1.0.0.0,文化=中立,公钥=空'。在 System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
在System.Data.Entity.Migrations.Design.ToolingFacade.Run(跑垒员 浇道)在 System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串 targetMigration,布尔力)在 System.Data.Entity.Migrations.UpdateDatabaseCommand。 <> c
_DisplayClass2。 < .ctor> B_ 0() 在 System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(动作 命令)类型未解决的构件 “System.Diagnostics.Contracts。 _ContractsRuntime + ContractException + ContractExceptionData,WebForms, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。

+0

我有同样的问题,我猜这是'ContractException'类是内部问题,因此不会引发异常细节到控制台,可能是跨越'AppDomain'边界的问题。 – nicodemus13

回答

0

我已经管理不完全解决这个问题,但至少能够解决如何隔离问题。你的外部方法是提高

显然一个ContractException这并不有效报告到控制台,可能是由于其是跨边界AppDomain一个internal类和非constructible?

假设可以,请转至项目属性并在Code Contracts选项卡上关闭Perform runtime contract checking。对我来说,这立即突出显示了这个问题,因为迁移代码在实际的细节上抛出了一个ArgumentException

如果这不显示问题,那么您需要计算出Contract最有可能失败的位置,并用“正常”异常替换每个ContractException并重新测试,直到抛出“正常”异常为止确定哪个合同失败。

然后是否对此程序集进行运行时合同检查是一个问题。你有三个选择:

  1. 设计您的代码,以确保没有Contract.Requires的(这我假设它是)可以在运行时失败(这是它应该是什么样的理论),而不是担心。然后,您将遇到一些困难,调试任何您错过的情况下可能发生的问题。

  2. 关闭运行时检查。这样你会得到一个'正常'的例外(尽管理论上应该没有任何的例外)。有些人喜欢这样做,有些人则不喜欢。我宁愿保留它们。

  3. 将无法​​处理ContractExceptions的任何代码隔离到其自己的程序集中,并关闭运行时合同检查。不一定是理想的,但它可以让你保持运行时检查代码的其余部分。

相关问题