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

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

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

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

例:

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

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

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

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

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

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

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

我想你的应用程序中仍然有以下声明:

 Database.SetInitializer(new CreateDatabaseIfNotExists()); 

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

 Database.SetInitializer(new DropCreateDatabaseIfModelChanges()); 

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

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

  public class YourContext: DbContext { public YourContext(): base("DefaultConnectionString") { Database.SetInitializer(new MigrateDatabaseToLatestVersion("DefaultConnectionString")); } } 

现在,您有两种选择:

  • 自动迁移

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

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

     public Configuration() { AutomaticMigrationsEnabled = true; } 
  • 基于代码的迁移

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

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