【问题标题】:model changed, update database using codefirst模型已更改,使用 codefirst 更新数据库
【发布时间】:2014-05-18 12:41:13
【问题描述】:

我使用代码优先来创建数据库。现在我试图制作一个 linq 表达式来从数据库中获取数据,但后来我收到了这个错误:

“支持 'FantasySport' 上下文的模型在创建数据库后发生了变化。考虑使用 Code First 迁移来更新数据库”

所以我转到包管理器控制台并键入更新数据库,它说没有什么要更新的。

"PM> 更新数据库 指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。 没有挂起的基于代码的迁移。 运行种子方法。”

----编辑-----

这里是初始化方法:

  private class SimpleMembershipInitializer
    {
        public SimpleMembershipInitializer()
        {
            Database.SetInitializer<UsersContext>(null);

            try
            {
                using (var context = new UsersContext())
                {
                    if (!context.Database.Exists())
                    {
                        // Create the SimpleMembership database without Entity Framework migration schema
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                    }
                }

                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
            }
        }

那么问题是什么?

【问题讨论】:

    标签: linq ef-code-first


    【解决方案1】:

    您首先必须添加要更新到的迁移。您可以通过在包管理器控制台中输入以下命令来完成:

    add-migration "a custom name for your migration here..."
    

    这将导致创建迁移,之后您可以从包管理器控制台运行Update-database 命令。

    [编辑] Database.SetInitializer 方法指定动态创建和播种数据库的策略。由于这是导致此错误的原因,并且由于我们通过 update-database 命令手动创建和播种数据库,因此我们希望将其关闭。 http://www.codeguru.com/csharp/article.php/c19999/Understanding-Database-Initializers-in-Entity-Framework-Code-First.htm

    【讨论】:

      【解决方案2】:

      为了能够通过迁移更新数据库,您必须使用

      add-migration "<migration-name>"
      

      command 但是我经历过它有时会“卡住”,这意味着您将收到此错误,或者它会显示通常的消息,即需要另一个迁移步骤。要解决这个问题,请确保

      • 没有隐藏的迁移文件未被删除,刚刚从项目中删除
      • 始终在 add-migration 命令之后构建项目,然后再发出 update-database 命令
      • 确保在您发出 update-database 命令的项目中与数据库的连接字符串相同,指向您的程序使用的同一数据库。

      除此之外,您可以检查 __MigrationHistory 表是否包含所有迁移步骤,包括最新的迁移步骤,因为实体框架会根据该表的记录测试当前模型。

      其中一些巫毒术(如重建和清理)仅在 EF 4.4 前后才需要,我猜更新数据库脚本在这方面也得到了改进。

      【讨论】:

      • 在哪里可以找到隐藏的迁移文件?
      • 没什么多余的,我的意思是项目中的隐藏文件,VS中有一个按钮可以显示项目的隐藏文件。
      • 我删除了所有的迁移文件,添加了一个新的迁移并重建项目,然后更新了数据库,我仍然得到同样的错误。为什么我可以将数据添加到数据库中,但是当我尝试获取数据时却出现了这个错误?这就是我失败时尝试做的事情:var query = from r in _db.User select r.UserName;
      • 好奇...这两个东西不应该联系在一起。您使用哪个实体框架版本?如果它是一个测试项目,你能把代码贴在某个地方让我看看吗?
      • 巫婆两个东西不应该连接? EF 5.0,刚开始是个小项目。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 2013-07-02
      相关资源
      最近更新 更多