无法获取代码优先自动迁移以在现有SQL Server CE数据库上工作

Dan*_*lis 5 entity-framework entity-framework-4 entity-framework-4.1

摘要:

我将从摘要开始,然后按照细节进行操作.对于我的项目,工作目录中的实时.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.
Run Code Online (Sandbox Code Playgroud)

系统创建了一个Migrations包含Configuration.cs文件的目录.

然后我跑了

Update-Database
Run Code Online (Sandbox Code Playgroud)

命令,并得到消息No pending code-based migrations.我检查了工作目录中的实时数据库文件,它没有改变.但是,Program Files/Microsoft Visual Studio 10.0/Common7/IDE目录中具有相同名称的新数据库文件具有相同的名称,并且是一个包含所有相应表的空数据库,包括与DbContext派生类中的两个新DbSets对应的两个表,以及一个名为的新表_MigrationHistory,其中包含一个条目.实时.sdf文件保持不变,没有新表,也没有_MigrationHistory表.

尝试2,使用"InitialMigration":

根据http://www.ladislavmrnka.com/2012/03/ef-4-3-migrations-and-existing-database/

为了准备第二次尝试,我通过做三件事来恢复程序的原始状态(即,到我尝试迁移之前的状态).我从DbContext派生类中删除了2个新的DbSet.我删除了Migrations目录(和随附的Configuration.cs文件),并删除了".../Common7/IDE"目录中的无用数据库文件(.sdf文件).

然后我执行了命令:

Enable-Migrations -EnableAutomaticMigrations
Run Code Online (Sandbox Code Playgroud)

它创建了Migrations目录和Configurations.cs文件.

然后我执行了

Add-Migration InitialMigration -IgnoreChanges
Run Code Online (Sandbox Code Playgroud)

command,它将201208281905525_InitialMigration.cs文件添加到Migrations目录.

然后,根据引用的网页上的说明,我修改Up了文件中的方法,以便InitialMigration该类成为以下内容:

public partial class InitialMigration : DbMigration
{
    public override void Up()
    {
        Sql("DROP TABLE EdmMetadata");
    }

    public override void Down()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我执行了

Update-Database
Run Code Online (Sandbox Code Playgroud)

命令,并得到消息The specified table does not exist. 我检查了工作目录中的实时数据库,发现数据库中确实有一个EdmMetadata表.然后我检查了.../Common7/IDE目录,发现在那里创建的新数据库没有该表.

因此,所有"迁移"活动都发生在.../Common7/IDE文件版本上,而不是发生在工作目录中的实时数据库文件中.

如何让它在现有的实时数据库文件上运行?

谢谢,