Dav*_*eta 24 c# sql-server entity-framework ef-code-first entity-framework-4.1
我正在开发一个项目,该项目使用Entity Framework 4.1将我们的各种对象持久化到数据库(代码优先).
我在Visual Studio中使用本地SQL Express DB进行测试,我们的Jenkins服务器将已提交的代码部署到测试服务器.发生这种情况时,我暂时将本地连接字符串更改为指向测试数据库服务器并运行单元测试以重新创建测试数据库,以使其与我们的最新实体等相匹配.
我最近注意到我们的测试服务器发出了这个错误:
自创建数据库以来,支持"EntityFrameworkUnitOfWork"上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.
这通常表明我们的代码已经更改,我需要运行单元测试来重新创建数据库.除了我刚刚那样做!我不相信我们的部署过程有任何问题 - 测试服务器上的DLL似乎与我的本地环境中的版本相同.是否有任何其他设置或环境因素可能导致自创建数据库以来模型发生更改的错误?
我是新来的 - 谢谢你的帮助!
Lad*_*nka 25
您看到的错误意味着存储在EdmMetadata表中的模型哈希与从应用程序中的模型计算的模型哈希不同.因为您正在从不同的应用程序(您的开发应用程序)运行数据库创建,所以这两者可能不同.这里的简单建议是:不要使用不同的应用程序来创建数据库,而是让主应用程序创建数据库(自动或例如使用某个管理界面).
作为另一种选择,您应该可以通过删除负责这些检查的约定来完全关闭此检查:
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
Run Code Online (Sandbox Code Playgroud)
模型哈希计算依赖于应用程序中的当前实体(不同模型哈希中的任何简单更改结果)以及数据库服务器版本/清单.例如,部署在SQL Server 2005和2008上的模型将具有不同的模型散列(Express vs. Full或2008与2008 R2不应导致不同的模型散列).
这可能是由于不同平台上的反射排序差异造成的.要进行验证,您可以使用EdmxWriter API来比较两种环境中的EDMX.如果任何表具有不同的列排序,那么这就是问题所在.
要解决此问题,您可以更改测试数据库的更新方式,以便从测试服务器而不是本地方框更新测试数据库.
我们将在下一个版本中修复此问题.
在代码优先方法中,SSDL是在代码执行期间生成的.生成的SSDL中包含的信息之一是DbConnection中使用的提供程序的名称.正如您所说,您正在连接到不同的数据库引擎,因此您必须使用两个不同的提供程序.这完全改变了散列函数的输出.
以下代码是从EntityFramework程序集中提取的:
using (XmlWriter writer = XmlWriter.Create(output, settings))
{
new SsdlSerializer().Serialize(database, providerInfo.ProviderInvariantName, providerInfo.ProviderManifestToken, writer);
}
Run Code Online (Sandbox Code Playgroud)