要点:
我将从摘要开始,然后按照细节进行操作。对于我的项目,工作目录中的实时.sdf数据库文件中不会发生自动迁移。就好像.sdf文件不存在一样。相反,所有配置操作都在它在Program Files/Microsoft Visual Studio 10.0/Common7/IDE
目录中创建的新的空数据库文件上执行。如何让它在工作目录中的live .sdf数据库文件中运行?
详细信息:
该项目在Visual Studio 2010 Ultimate中使用Code First EF。该项目以EF 4.1开始,我刚刚将项目更新为EF 4.4。
数据库文件是SQL Server Compact Edition 4.0文件,该文件与可执行文件(即工作目录)位于同一目录中。一段时间以来一切都运行正常,但我想在DbContext中添加两个新的DbSet,因此向数据库文件添加两个新表。当我将新版本的程序部署到客户时,我希望程序能够无缝地将两个新表添加到数据库中,并继续进行,就像没有发生任何事情一样,保留其他表中未发现的所有现有数据。
尝试1
根据http://msdn.microsoft.com/en-US/data/jj554735:
中描述的流程我在DbContext派生类中添加了两个新的DbSet。当我尝试运行该程序时,我得到以下异常:The model backing the 'DrillContext' context has changed since the database was created. Consider using Code First Migrations to update the database
。这是我预期会发生的事情,因为我还没有启用迁移。
在包管理控制台中,我发出了命令:
Enable-Migrations -EnableAutomaticMigrations.
系统创建了一个Migrations
目录,其中包含Configuration.cs
个文件。
然后我跑了
Update-Database
命令,并收到消息No pending code-based migrations
。我检查了工作目录中的实时数据库文件,它没有改变。但是,在Program Files/Microsoft Visual Studio 10.0/Common7/IDE
目录中有一个具有相同名称的新数据库文件具有相同的名称,并且是一个包含所有相应表的空数据库,包括与DbContext中两个新DbSets对应的两个表-derived类,以及一个名为_MigrationHistory
的新表,其中包含一个条目。实时.sdf文件保持不变,没有新表,没有_MigrationHistory
表。
尝试2,它使用“InitialMigration”:
每http://www.ladislavmrnka.com/2012/03/ef-4-3-migrations-and-existing-database/
为了准备第二次尝试,我通过做3件事恢复了程序的原始状态(即,我尝试迁移之前的状态)。我从DbContext派生类中删除了2个新的DbSet。我删除了Migrations目录(和随附的Configuration.cs文件),并删除了“... / Common7 / IDE”目录中无用的数据库文件(.sdf文件)。
然后我执行了命令:Enable-Migrations -EnableAutomaticMigrations
创建了Migrations目录和Configurations.cs文件。
然后我执行了
Add-Migration InitialMigration -IgnoreChanges
命令,它将201208281905525_InitialMigration.cs
文件添加到Migrations目录。
然后,根据引用网页上的说明,我修改了文件中的Up
方法,以便InitialMigration
类成为以下内容:
public partial class InitialMigration : DbMigration
{
public override void Up()
{
Sql("DROP TABLE EdmMetadata");
}
public override void Down()
{
}
}
然后我执行了
Update-Database
命令,并收到消息The specified table does not exist.
我检查了工作目录中的实时数据库,发现数据库中确实存在EdmMetadata表。然后我检查了.../Common7/IDE
目录,发现在那里创建的新数据库没有表。
因此,所有“迁移”活动都发生在文件的.../Common7/IDE
版本上,而不是工作目录中的实时数据库文件上。
如何让它在现有的实时数据库文件上运行?
谢谢,