仅entity framework代码错误:自创build数据库以来,支持上下文的模型已更改
我创build了一个“Code Only”POCO,用于使用entity framework4和CTP4的现有数据库。 当我运行一个查询时,我得到了错误
自从创build数据库以来,支持“xyzContext”上下文的模型已经发生了变化。 可以手动删除/更新数据库,也可以使用IDatabaseInitializer实例调用Database.SetInitializer。 例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创build数据库,并可以select将其与新数据结合使用。
我不清楚为什么会发生这种情况,或者我可以改变。 我只是创build了POCO,定义了一个简单的DbContext,做了一些调整,然后尝试运行一个简单的查询。 由于我使用“仅限代码”,因此我不了解需要进行的任何configuration设置。 我当然不想重新创build或删除数据库,因为它是一个现有的数据库。
感谢您的任何想法。
我在Scott Guthrie博客的这篇文章的评论中find了答案。
http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx
对于那些看到这个例外的人:
“创build数据库后,支持”Production“上下文的模型已经发生了变化,无论是手动删除/更新数据库,还是使用IDatabaseInitializer实例调用Database.SetInitializer。
以下是正在发生的事情以及如何处理:
首次创build模型时,我们运行DatabaseInitializer来执行创build数据库(如果不存在)或添加种子数据。 默认的DatabaseInitializer尝试将使用模型所需的数据库模式与存储在使用数据库创build的EdmMetadata表(在Code First是创build数据库的那个时)中存储的模式的散列进行比较。 现有的数据库将不会有EdmMetadata表,所以不会有哈希…如果缺less该表,今天的实现将抛出。 因为它是默认版本,所以我们将在改变这种行为之前努力工作。 在此之前,现有数据库通常不需要任何数据库初始化程序,因此可以通过调用以下方式closures您的上下文types:
Database.SetInitializer<Production>(null);
这是CTP4中使用EF与预先存在的数据库的一个错误。
你可以通过调用:
Database.SetInitializer<YourContext>(null);
在Global.asax的Application_Start方法中
我上面评论过,当时我只是在EF5上玩弄自己的工作。 现在我正在编写“实际”代码,并且由于我已经使用MEF来实例化任何DbContext并将所有configuration依赖项注入为可组合部分,因此我已经摆脱了在代码中为每个上下文设置数据库初始化程序的风险。
所以我又立即遇到了上述的错误,但是这次我select使用下面的configuration文件条目解决它。
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <contexts> <context type="Basd.Erp.ContactContext, Basd.Erp" disableDatabaseInitialization="true"></context> </contexts> </entityFramework>
所以通过在entityFramework的configuration文件部分设置disableDatabaseInitialization =“true”,你可以克服上述错误,因为它不在代码中,其中一个好处是能够“更容易”使用抽象的构build器/工厂来创build上下文。
我只需要删除__MigrationHistory
表。
语境:
当我更改表的名称时收到此错误。 将注释[Table("NewTableName")]
到我的某个模型之后,Entity Framework生成了__MigrationHistory
表。
我有同样的问题 – 重新添加迁移和更新数据库不起作用,没有上述答案似乎是正确的。 然后,灵感打击了我 – 我使用多层(一个networking,一个数据和一个业务)。 Web层从来没有抛出这个exception – 这是业务层(我设置为控制台应用程序进行testing和debugging)。 事实certificate,业务层没有使用正确的连接string来获取数据库并创build上下文。 所以我添加了连接string的应用程序configuration和中提琴的作品。 把这个放在这里可能会遇到同样的问题。