5

概括:

我将从摘要开始,然后是详细信息。对于我的项目,工作目录中的实时 .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文件版本上,而不是工作目录中的实时数据库文件上。

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

谢谢,

4

0 回答 0