EF Code First认为数据库已过时-仅在生产中

问题描述

|| 我有一个使用SQL Server CE 4.0和Entity Framework 4.1 Code First的ASP.NET MVC 3应用程序。它在本地运行良好,但在生产中失败,并显示以下错误:   自创建数据库以来,支持\'foobar \'上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer。例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可以选择用新数据作为种子。 我已经验证了我的应用程序dll和数据库文件在远程服务器上是最新的,但是我继续遇到此错误。 知道可能是什么问题吗? 注意:我正在使用RTF版本的Entity Framework 4.1,而不是CTP。 编辑 好的,如果删除EdmMetadata表,然后将数据库重新发布到生产服务器,则不会再出现此错误。但是,我完全不明白为什么我必须这样做。型号未更改。它几周都没有改变,我只是在今天才重建了数据库。我猜这件事的关键是哈希。将EdmMetadata哈希与什么进行比较? 编辑2 根据Mark S的回答,将EdmMetadata表中的哈希与SSDL的哈希进行比较。但是,解决方案中的任何地方都没有实际的SSDL文件(没有扩展名为.ssdl的文件,也没有包含\“ ssdl \”的文件)。那么,SSDL实际上存储在哪里?它是在设计时或运行时生成的吗? 编辑3 为了回答我自己的问题,SSDL确实会在运行时生成并缓存(在此处有更多详细信息),但是查看SSDL的实际架构,我不确定是否仅因为项目的DLL就可以看到可能会更改的任何内容住在不同服务器上的不同位置。 注意:我正在使用完全相同的数据库文件(.sdf)进行测试和生产。我实际上是将文件从bin / App_Data ftp-到生产服务器上的App_Data文件夹。我也通过FTP传输项目DLL。因此,测试和生产之间唯一不同的是这些文件位于不同的位置。 另外,仅作记录,这是我的连接字符串:
DataSource=|DataDirectory|foobar.sdf\" providerName=\"System.Data.SqlServerCe.4.0
编辑4(最终编辑?) 问题原来是DLL问题。我认为EntityFramework DLL的另一个版本正在远程与本地使用。解决方案是确保我拥有最新版本的EF 4.1(RTW),清除并重新添加引用,重新生成数据库并重新发布。现在一切都很好。     

解决方法

        响应“与之比较的EdmMetadata哈希是什么?” EdmMetadata表使Code First可以确定代码中的模型是否与数据库中的模型相同。该表包含一行,这是您的SSDL的哈希。 SSDL代表商店架构定义语言,是一种基于XML的语言,用于描述实体模型和模型之间的映射。 您可以在http://msdn.microsoft.com/zh-cn/library/bb399559.aspx上了解有关SSDL的更多信息并查看规范。 您提到在本地工作正常,但在生产中却没有。您是否允许Code First构建本地数据库和生产数据库?生产数据库是否已经存在或正在以其他方式生成? CodeFirst报告数据库中的哈希与当前模型的哈希不匹配,因此必须有所不同。找出可能的挑战。 EdmMetadata表映射到EdmMetadata类。此类中有一个TrygetModelHash方法,可用于获取给定上下文的哈希。如果您绝望,可以使用它来将当前模型与生产数据库中的哈希进行比较。这至少使您不必为了测试而不断建立新的数据库。 如果需要,您还可以指示Code First排除EdmMetadata表。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
    ,        禁用验证:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
    ,观看此视频: http://www.pluralsight-training.net/microsoft/players/PSODPlayer.aspx?author=scott-allen&name=mvc3-building-data-i&mode=live&clip=0&course=aspdotnet-mvc3-intro 这是http://asp.net/mvc上免费的复数视力训练的一部分。点击页面左侧的“课程发生变化时”视频,然后转到视频中的8:30。 显然,如果您删除数据库中的“ 3”表,EF将禁用模型验证。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...