实体框架代码仅错误:自创建数据库以来,支持上下文的模型已更改

Don*_*hes 50 .net c# entity-framework entity-framework-4

我创建了一个"仅代码"POCO,用于使用Entity Framework 4和CTP4对现有数据库进行使用.当我运行查询时,我收到错误

自创建数据库以来,支持'xyzContext'上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer.例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并可选择使用新数据对其进行种子设定.

我不清楚为什么会发生这种情况或者我可以改变什么.我只创建了POCO,定义了一个简单的DbContext,做了一些调整,然后尝试运行一个简单的查询.由于我使用的是"仅代码",因此我不知道需要进行任何配置设置.我当然不想重新创建或删除数据库,因为它是一个现有的数据库.

谢谢你的任何想法.

Don*_*hes 77

我在Scott Guthrie博客上的这篇文章的评论中找到了答案.

http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx

对于那些看到这个例外的人:

"自创建数据库以来,支持'Production'上下文的模型已更改.手动删除/更新数据库,或使用IDatabaseInitializer实例调用Database.SetInitializer."

以下是该怎么做以及如何处理它:

首次创建模型时,我们运行DatabaseInitializer来执行创建数据库(如果不存在)或添加种子数据等操作.默认的DatabaseInitializer尝试将使用模型所需的数据库模式与存储在使用数据库创建的EdmMetadata表中的模式的哈希进行比较(当Code First是创建数据库的模式时).现有数据库将没有EdmMetadata表,因此不会有哈希...如果缺少该表,今天的实现将抛出.我们将在发送fial版本之前更改此行为,因为它是默认版本.在此之前,现有数据库通常不需要任何数据库初始化程序,因此可以通过调用以下内容类型来关闭它:

Database.SetInitializer<Production>(null);
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚在2013年解决了这个完全相同的问题,你的答案修正了EF5.所以他们没有解决它的一些非常好的理由,是否有EF5的新模式? (4认同)
  • 使用EF6,我只是手动更新了数据库并删除了迁移表. (3认同)
  • 我为解决这个问题而删除的表是我以前的示例构建中的__MigrationHistory.这解决了这个问题. (3认同)
  • FYI与EF6有同样的问题,这令人惊讶.这个答案解决了我的问题(在我预先存在的sql server数据库之上集成了asp.net身份生成表). (2认同)

小智 31

这是CTP4中的错误,用于将EF与预先存在的数据库一起使用.

你可以通过调用来修复它:

Database.SetInitializer<YourContext>(null);
Run Code Online (Sandbox Code Playgroud)

在Global.asax的Application_Start方法中


ris*_*ism 13

我在上面评论过,当我只是玩EF5时,它的工作就是熟悉它.现在我正在编写"实际"代码,并且我已经放弃了在代码中为每个上下文设置数据库初始化程序,因为我已经决定使用MEF实例化任何DbContext并将所有配置依赖项注入可组合部分.

所以我再次立即遇到上述错误,但这次我选择使用配置文件条目解决它,如下所示.

<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>
Run Code Online (Sandbox Code Playgroud)

因此,通过在entityFramework的配置文件部分中设置disableDatabaseInitialization ="true",您可以克服上述错误,因为它不在代码中,其中一个好处是能够"更轻松地"使用抽象的构建器/工厂来创建上下文.


Jar*_*ach 5

我所要做的就是放下桌子__MigrationHistory

语境:

当我更改表的名称时,我收到此错误。将注释添加[Table("NewTableName")]到我的一个模型后,实体框架生成了一张__MigrationHistory表。