在学习和跟随迁移部分时,我已经完成了初始化,然后跟着它进行了接下来的两次迁移,如图所示。在上次迁移时,“课程”的错误已存在于数据库中。确切的错误“数据库中已经有一个名为'Course'的对象。”我删除了所有迁移并重新执行了显示的迁移,每次都以相同的错误结束。
两部分问题:为什么会出现这种类型的错误?以及如何完全删除所有迁移(我的迁移文件夹为空),以便可以继续进行下一次迁移。我错过了什么吗?
答案 0 :(得分:0)
这可能是一个适合单个答案的重要主题。我会尽力给你一个概述,背景和建议。需要进一步阅读以充分了解如何使用实体框架。我将主要介绍移民,因为这是你问题的主旨。
<强>概览强>
实体框架迁移提供了将对数据库所做的更改回滚到指定迁移中包含的数据库模式的功能;例如通过将数据库返回到先前的模式来撤消模式更改 - 并将其还原到其原始状态。
请注意,在应用或回滚迁移时可能会发生数据丢失,但在您的方案中,这可能并不重要。
将数据库返回到特定迁移的命令是:
Update-Database -TargetMigration:"migration_name"
返回数据库初始原始状态的命令是:
Update-Database –TargetMigration: $InitialDatabase
实体框架还具有Database Initialization
和Initialization Strategies
的可选概念,允许开发人员指定数据库应该只创建一次,或者每次运行应用程序时删除和创建,具体取决于如果他们的Code First
模型已经改变。有关数据库初始化的更深入内容,请参阅these tutorials。
正如您所说,您的迁移文件夹中没有迁移文件,我们继续......
<强>背景强>
首次运行Enable-Migrations
命令时,它将创建一个用于管理后续迁移应用程序的类。
当您生成第一个迁移时,通过执行,例如:
Add-Migration InitialCreate
这将在您的Migrations文件夹中创建一个InitialCreate
文件,其中包含初始架构,根据您将由Entity Framework保留的类模型。示例名称InitialCreate
是可选的,可以是您想要的任何内容 - 它只是一个可以在以后引用的标签。
随后,当您发出Add-Migration
命令时,将创建进一步的迁移以应用与您的类相关的架构更改;它们将添加到您的Migrations文件夹中,但 尚未应用于数据库。
然后,可以通过发出Update-Database
命令将迁移应用于您的数据库。如果在没有参数的情况下执行,则数据库模式将更新为最新迁移定义的模式。
如果您正确地遵循Contoso教程, 应该有多个迁移,其中一个包含“&#39; Initial&#39;以其名义,作为公约的一部分。
<强>建议强>
如果您没有看到这些内容,则可能是您未通过发出命令Enable-Migrations
初始化迁移。
首次执行Update-Database后,请验证这是否还会创建名为__MigrationHistory
的数据库表 - 这将跟踪已应用的架构版本和迁移。
您可能以错误的顺序应用了迁移,现在它与您的类结构不匹配,或者与数据库中的架构跟踪不同步。
在您目前的情况下,当您按照教程进行操作时,最好删除您的数据库,然后按照Microsoft概述的步骤重新创建数据库,特别注意Enable-Migrations
的输出, Add-Migration
和Update-Database
命令,在每个步骤验证数据库架构。
<强>参考强>
供参考,可以找到如何使用迁移的概述on MSDN here.
可以找到使用迁移与MVC的演练here