如果在DbContext中更改model-class,我是否重建数据库?

时间:2015-02-13 19:50:58

标签: c# asp.net-mvc entity-framework

我在带有DBContext的MVC中有我的应用程序,在我的SQL的本地主机中,我的数据库有数据。然后我需要在一个表中添加一个新列,在我的模型类中添加我的新成员,然后在SQL中修改我的表但是当我执行我的应用程序时:" ..上下文已经改变...考虑先使用代码迁移..."

5 个答案:

答案 0 :(得分:1)

查看此文章:https://msdn.microsoft.com/en-us/data/jj591621.aspx

如果您按照必需步骤操作,则可以从“程序包管理器控制台”运行“更新数据库”。

示例:

  1. 进行必要的代码更改
  2. 程序包管理器控制台:运行添加迁移 [迁移名称]
  3. 对生成的代码进行必要的更改。
  4. 程序包管理器控制台:运行更新数据库

答案 1 :(得分:1)

@anAgent在这里为您解答了答案。我想向您提供有关此处发生的更多信息,以便您了解为什么这些步骤是必要的。

为了生成迁移,Entity Framework会创建一个_MigrationHistory表,用于跟踪应用程序实体的状态。每次运行迁移时,都会在此表中添加一个新行,并在此时使用模式的散列版本。启动时,Entity Framework使用此存储状态与实体的当前状态进行比较,如果它们不匹配,则会收到该错误,告知您模型支持已更改。这意味着为了使您的应用程序代码能够使用底层数据库,需要进行架构修改或者存在SQL错误。

您所做的是手动对数据库进行适当的更改,这足以使应用程序正常运行。但是,由于此_MigrationHistory表仍具有旧状态作为最新状态,因此实体框架仍认为需要更新架构。同样,它不是在查看数据库的当前状态;它正在查看上次成功迁移后的数据库状态。

所有这一切归结为你必须:

  1. 请遵循@ anAgent的建议并实际使用迁移进行更改,而不是手动更改架构。

  2. 删除_MigrationHistory表并继续手动更新架构。如果此表不存在,则实体框架会将数据库有效地视为现有数据库,并且不会对其进行迁移,甚至不会提示您。但是,这会将球完全放在你的球场上。您将100%负责管理架构,如果您对应用程序进行了更改而忽略了也适当地更新了数据库架构,则应用程序将引发SQL错误异常。

答案 2 :(得分:0)

如果您的模型在某些方面发生了变化,您还需要更改数据库架构。如异常所示,是时候开始使用Code First Migrations了。您需要使用新的db初始化策略MigrateDatabaseToLatestVersion在上下文类中设置数据库初始化程序,如下所示:

    public class YourContext: DbContext 
    {
        public YourContext(): base("DefaultConnectionString") 
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<YourContext, YourProject.Migrations.Configuration>("DefaultConnectionString"));    
        }
    }

现在,您有两种选择:

  • Automated Migration

    您运行应用程序并始终将数据库保存在最新版本中,因为EF会在每次需要时进行隐式迁移 - 在最纯粹的版本中,除了启用自动迁移之外,您永远不需要执行任何操作

    如果您正确启用了迁移,那么您还应该有一个名为 Migrations 的文件夹,并且其中包含Configuration类,其构造函数应如下所示(如果您要启用自动迁移):

    public Configuration()
    {
      AutomaticMigrationsEnabled = true;
    }
    
  • Code-base Migration

    如果关闭自动迁移,则必须始终定义显式迁移,以便在明确定义的显式步骤中定义数据库升级过程。这对于需要同时使用升级和降级到特定版本的情况特别有用。在这种情况下,您需要使用Add-Migration命令将此更改写入基于代码的迁移,以便您可以编辑它。 Add-Migration命令允许您为这些迁移命名,例如Add-Migration AddSomeProperty。执行该命令后,在迁移文件夹中,您将有一个新的迁移文件,其名称预先固定时间戳以帮助订购。

答案 3 :(得分:0)

我认为您的应用程序中仍然存在以下声明:

Database.SetInitializer(new CreateDatabaseIfNotExists<InterstoneContext>());

在这种情况下,如果不存在,它将重新创建数据库。还有一个这样的:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<InterstoneContext>());

第二个将验证您的数据库是否已更改。这就是你似乎正在发生的事情。如果禁用此功能,则不会进行验证。 您更改了数据库,并且更改了代码,因此如果我理解正确,则不需要迁移。但必须注释掉上述语句或任何setinitialiser。

答案 4 :(得分:-1)

错误消息确切地说明了您需要做什么&#34;使用代码优先迁移来生成更改脚本&#34;。