Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅实体框架代码错误:自创建数据库以来,支持上下文的模型已更改_C#_.net_Entity Framework_Entity Framework 4 - Fatal编程技术网

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

C# 仅实体框架代码错误:自创建数据库以来,支持上下文的模型已更改,c#,.net,entity-framework,entity-framework-4,C#,.net,Entity Framework,Entity Framework 4,我使用EntityFramework4和CTP4创建了一个“仅代码”POCO,用于现有数据库。当我运行查询时,我得到了错误 自创建数据库以来,支持“xyzContext”上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用database.SetInitializer。例如,RecreateDatabaseIfModelChanges策略将自动删除和重新创建数据库,并可以选择使用新数据为其种子 我不清楚为什么会发生这种情况,或者我能改变什么。我只是创建

我使用EntityFramework4和CTP4创建了一个“仅代码”POCO,用于现有数据库。当我运行查询时,我得到了错误

自创建数据库以来,支持“xyzContext”上下文的模型已更改。手动删除/更新数据库,或使用IDatabaseInitializer实例调用database.SetInitializer。例如,RecreateDatabaseIfModelChanges策略将自动删除和重新创建数据库,并可以选择使用新数据为其种子

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


谢谢你的建议。

我在Scott Guthrie博客上的评论中找到了答案

对于看到此异常的人:

自创建数据库以来,支持“生产”上下文的模型已更改。请手动删除/更新数据库,或使用IDatabaseInitializer实例调用database.SetInitializer

以下是正在发生的事情以及如何应对:

第一次创建模型时,我们运行DatabaseInitializer来执行创建数据库(如果数据库不存在)或添加种子数据等操作。默认DatabaseInitializer尝试将使用模型所需的数据库架构与使用数据库创建的EdmMetadata表中存储的架构哈希进行比较(当Code First是创建数据库的代码时)。现有数据库不会有EdmMetadata表,因此也不会有哈希……如果缺少该表,今天的实现将抛出。在发布最终版本之前,我们将致力于更改此行为,因为它是默认版本。在此之前,现有数据库通常不需要任何数据库初始值设定项,因此可以通过调用以下命令来关闭上下文类型的初始值设定项:

Database.SetInitializer<YourContext>(null);
Database.SetInitializer(null);

这是CTP4中的一个缺陷,用于将EF与预先存在的数据库一起使用

您可以通过调用以下命令进行修复:

Database.SetInitializer<YourContext>(null);
Database.SetInitializer(null);

在Global.asax的Application_Start method中,我在上面进行了评论,它在我刚刚玩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>


因此,通过在entityFramework的config file部分中设置disableDatabaseInitialization=“true”,您可以克服上述错误,而且由于它不在代码中,因此好处之一是能够“更轻松地”使用抽象的构建器/工厂来创建上下文。

我所要做的就是删除
\u MigrationHistory

背景:


我在更改表名时收到此错误。在我将注释
[表(“NewTableName”)]
添加到我的一个模型后,Entity Framework生成了一个
\uuu MigrationHistory
表。

我也遇到了同样的问题-重新添加迁移和更新数据库不起作用,上面的答案似乎都不正确。然后灵感涌上心头——我使用了多个层次(一个网络、一个数据和一个业务)。web层从未抛出此异常-它是业务层(我将其设置为用于测试和调试的控制台应用程序)。事实证明,业务层没有使用正确的连接字符串来获取数据库并生成上下文。因此,我将连接字符串添加到应用程序配置中,viola可以正常工作。为可能遇到相同问题的其他人将此放在此处。

我通过将此添加到上下文构造函数中解决了此问题

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>());
Database.SetInitializer(新的MigrateDatabaseToLatestVersion());

完成此操作后,我的代码第一次迁移现在会在数据库已经存在时自动运行。

对于本例中的此错误,我刚刚从“DBControlContext”中删除了“\u MigrationHistory”表上的所有记录。
我希望这会有帮助。

我在2013年遇到了同样的问题,您的答案修复了EF5。所以,他们不是出于某种很好的原因才修复它的吗?EF5有新的模式吗?FYI和EF6有同样的问题,这令人惊讶。这个答案解决了我的问题(在我先前存在的sql server数据库上集成了asp.net identity生成的表)。使用EF6,我只是手动更新了数据库并删除了迁移表。我删除以解决问题的表是我以前的示例生成中的迁移历史记录。这就解决了问题。@CoderRoller,没错!删除uu MigrationHistory表已修复此问题。我正在使用MVC3。我在模型类中添加了一个额外的列。我还在global.asax中输入了您的代码。然而,我仍然得到错误。我认为旧数据库不会被删除或重新创建。如何向模型中添加新列并删除并重新创建db?
受保护的无效应用程序\u Start()
{
数据库.SetInitializer(null);
区域注册.RegisterAllAreas();
注册全局过滤器(GlobalFilters.Filters)
注册表项(RouteTable.Routes);
}
被否决,因为该问题不是asp.net问题。当我的上下文在单独的程序集中时,我在EF6中仍然存在此问题。这是一个很好的答案,正如@rism为abs建议的那样