Entity framework Can';t获取代码第一次自动迁移以在现有SQL Server CE数据库上工作

Entity framework Can';t获取代码第一次自动迁移以在现有SQL Server CE数据库上工作,entity-framework,entity-framework-4,entity-framework-4.1,Entity Framework,Entity Framework 4,Entity Framework 4.1,摘要: 我将从总结开始,然后是细节。对于我的项目,工作目录中的live.sdf数据库文件没有自动迁移。就好像那个.sdf文件不存在一样。相反,所有配置操作都在新的空数据库文件上执行,该文件在程序文件/Microsoft visualstudio 10.0/Common7/IDE目录中创建。如何让它在工作目录中的live.sdf数据库文件上工作 详细信息: 该项目使用Visual Studio 2010 Ultimate中的代码优先EF。该项目是从EF4.1开始的,我刚刚将项目更新为EF4.4 数

摘要:

我将从总结开始,然后是细节。对于我的项目,工作目录中的live.sdf数据库文件没有自动迁移。就好像那个.sdf文件不存在一样。相反,所有配置操作都在新的空数据库文件上执行,该文件在
程序文件/Microsoft visualstudio 10.0/Common7/IDE
目录中创建。如何让它在工作目录中的live.sdf数据库文件上工作

详细信息:

该项目使用Visual Studio 2010 Ultimate中的代码优先EF。该项目是从EF4.1开始的,我刚刚将项目更新为EF4.4

数据库文件是SQL Server Compact Edition 4.0文件,与可执行文件位于同一目录(即工作目录)。现在一切都正常工作了一段时间,但我想向DbContext添加两个新的dbset,从而向数据库文件添加两个新表。当我向客户部署新版本的程序时,我希望该程序能够无缝地将两个新表添加到数据库中,并继续运行,就好像什么都没有发生一样,保留其他表中的所有现有数据

尝试1

按照中所述的流程:

我向DbContext派生类添加了两个新的dbset。当我尝试运行该程序时,出现以下异常:
支持“DrillContext”上下文的模型自数据库创建以来已更改。考虑使用代码第一迁移来更新数据库。这是我所期望的,因为我还没有启用迁移

在包管理控制台中,我随后发出命令:

Enable-Migrations -EnableAutomaticMigrations.
Enable-Migrations -EnableAutomaticMigrations
系统创建了一个
Migrations
目录,其中包含
Configuration.cs
文件

然后我运行了

Update-Database
命令,并获得消息
无挂起的基于代码的迁移
。我检查了工作目录中的实时数据库文件,但没有更改。但是,在
Program Files/Microsoft Visual Studio 10.0/Common7/IDE
目录中有一个同名的新数据库文件,该文件名相同,是一个空数据库,包含所有适当的表,包括与DbContext派生类中的两个新数据库集对应的两个表,还有一个名为
\u MigrationHistory
的新表,其中只有一个条目。live.sdf文件保持不变,没有新表,也没有
\u MigrationHistory

尝试2,使用“初始迁移”:

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

然后我执行命令:

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

然后我执行了命令

Add-Migration InitialMigration -IgnoreChanges
Update-Database
命令,该命令将一个
201208281905525\u InitialMigration.cs
文件添加到Migrations目录

然后,根据引用的网页上的说明,我修改了文件中的
Up
方法,使
InitialMigration
类如下所示:

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

    public override void Down()
    {
    }
}
然后我执行了命令

Add-Migration InitialMigration -IgnoreChanges
Update-Database
命令,并收到消息
指定的表不存在。
我检查了工作目录中的live数据库,发现数据库中确实有一个EdmMetadata表。然后我检查了
../Common7/IDE
目录,发现在那里创建的新数据库没有该表

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

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


谢谢,

你好?!!有来自微软EF团队的人吗?你好有人知道答案吗?请检查连接字符串。你能提供DbContext类代码吗?你能给我们看一下
DbContext
类或声明数据库连接的配置文件吗?我自己在迁移方面有很多问题。它在本地环境中的工作方式不同,在主机中的工作方式也不同。一旦桌子不同步。。。你需要真正知道发生了什么。我用红门的一个叫做“SQL比较”的工具解决了我的问题。它非常酷而且直观。它将允许您创建您的表,并将它们与本地或主机匹配—您可以选择。请在这里看我的答案。而不是依靠移民,改变一个更好的工具-它免费2个星期,所以你至少可以让自己走出这个标准。