dev*_*xer 2 asp.net-mvc entity-framework sql-server-ce ef-code-first entity-framework-4.1
我有一个使用SQL Server CE 4.0和Entity Framework 4.1 Code First的ASP.NET MVC 3应用程序.它在本地工作正常,但在生产中,它失败并出现以下错误:
自创建数据库以来,支持'foobar'上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,DropCreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.
我已经验证我的应用程序DLL和数据库文件在远程服务器上是最新的,但我继续收到此错误.
知道问题可能是什么?
注意:我使用的是Entity Framework 4.1的RTF版本,而不是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/en-us/library/bb399559.aspx上阅读有关SSDL的更多信息并查看规范.
你提到事情在本地工作正常,但没有在生产中.您是否允许Code First构建本地数据库和生产数据库?生产数据库是否已经存在或以另一种方式生成?
CodeFirst报告数据库中的哈希与当前模型的哈希不匹配,因此必须有所不同.弄清楚什么可能是一个挑战.
EdmMetadata表映射到EdmMetadata类.此类中有一个TrygetModelHash方法,您可以使用该方法获取给定上下文的哈希值.如果您是绝望的,可以使用它来比较当前模型与生产数据库中的哈希值.这至少可以让您不必为了测试而不断构建新的数据库.
如果需要,您还可以指示Code First排除EdmMetadata表.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3140 次 |
| 最近记录: |