概括:
我将从摘要开始,然后是详细信息。对于我的项目,工作目录中的实时 .sdf 数据库文件不会发生自动迁移。就好像那个 .sdf 文件不存在一样。相反,所有配置操作都在它在Program Files/Microsoft Visual Studio 10.0/Common7/IDE
目录中创建的新的空数据库文件上执行。如何让它在工作目录中的实时 .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 派生类中的两个新 DbSet 对应的两个表,以及一个名为 的新表_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.
我检查了工作目录中的live database,发现数据库中确实有一个EdmMetadata表。然后我检查了.../Common7/IDE
目录,发现在那里创建的新数据库没有表。
因此,所有“迁移”活动都发生在.../Common7/IDE
文件版本上,而不是工作目录中的实时数据库文件上。
如何让它在现有的实时数据库文件上工作?
谢谢,