Entity framework MigrateDatabaseToLatestVersion和dbo.\u迁移历史记录

Entity framework MigrateDatabaseToLatestVersion和dbo.\u迁移历史记录,entity-framework,ef-code-first,entity-framework-migrations,Entity Framework,Ef Code First,Entity Framework Migrations,我正在尝试部署一个使用EF5 codefist和迁移构建的MVC4应用程序 我希望在将来使用新迁移部署应用程序的新版本时,应用程序更新数据库,因此在Global.asax中,我执行以下操作: Database.SetInitializer(new MigrateDatabaseToLatestVersion<GoDealMvc4Context, Configuration>()); using (var ctx = new GoDealMvc4Context()) { ctx

我正在尝试部署一个使用EF5 codefist和迁移构建的MVC4应用程序

我希望在将来使用新迁移部署应用程序的新版本时,应用程序更新数据库,因此在Global.asax中,我执行以下操作:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<GoDealMvc4Context, Configuration>());
using (var ctx = new GoDealMvc4Context()) {
    ctx.Database.Initialize(false);
}
因此,很明显,应用程序认为它需要应用迁移,即使数据库中存在包含以下内容的u MigrationHistory表:

MigrationId                 Model         ProductVersion
201210161046508_initial     0x1F8...      5.0.0.net45
该应用程序包含一个迁移类:

201210161046508_initial.cs:

public partial class initial : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.UserProfile",
            ....
因此,我的问题是: 1) 当u MigrationsHistory表的内容如所述时,为什么我的应用程序认为需要应用此迁移

2) 这是一种推荐的方法,可以使应用程序自动应用新的迁移,并且在新版本上重新启动。

1) 由于您的迁移称为“初始”而不是“初始创建”,这意味着您是手动创建的,并且当您启用代码优先迁移时,数据库还不存在。或者至少上下文没有指向它

我相信MigrateDatabaseToLatestVersion将首先尝试为启用迁移之前存在的实体创建实体表。由于数据库中不存在InitialCreate迁移,因此第一步将与已存在的表冲突。对不起,这有点模糊,但我不完全理解。为了解决这个问题,我将删除迁移(首先保存任何自定义更改),然后在上下文指向现有数据库的情况下再次启用迁移。您现在应该有一个“InitialCreate”迁移。现在,您应该能够复制数据库并在生产环境中使用MigratedatabaseTolatesVersion

(二)
就个人而言,让代码首先更新生产数据库让我有点担心。我一直在使用updatedatabase-script-sourcemigration xx生成迁移数据库的脚本。这样,在你打破任何东西之前,你可以看到将会发生什么。它还允许您在事务中运行,并在失败后回滚。

这里还有另一个令人讨厌的问题,任何人都在寻找答案。检查文件的内容

[dbo].[__MigrationHistory]   table    column ContextKey
此表说明如何创建数据库(迁移模式、创建模式等)。用什么样的迁移配置程序。我因迁移配置类名的更改而受伤


更改表中的条目有效:-)或重新命名代码。

在我的例子中,此问题是由于缺少迁移造成的。我对模型做了一些修改,但我忘了创建新的迁移文件


我的解决方案是在Package Manager控制台中运行:添加Migration MyMigrationName

以防其他人遇到带有消息
SqlException
数据库中已存在名为“”的对象。
在使用自动迁移更改模型后。在某些情况下,迁移的配置似乎需要显式命名上下文键:

internal sealed class Configuration : DbMigrationsConfiguration<MyDatabaseContext>
{
    public Configuration ()
    {
        AutomaticMigrationsEnabled = true;
        ContextKey = "MyNamespace.MyDatabaseContext"; // this line was missed
    }

    protected override void Seed(MyDatabaseContext context)
    {
    }
}
内部密封类配置:dbmigtorinsconfiguration
{
公共配置()
{
AutomaticMiggerationsEnabled=真;
ContextKey=“MyNamespace.MyDatabaseContext”;//缺少此行
}
受保护的覆盖无效种子(MyDatabaseContext上下文)
{
}
}

将上面的行添加到配置的构造函数后,迁移运行时没有出现任何问题。您可以检查
\uuu MigrationHistory
数据库中已在使用的
ContextKey
值。

踩在同一个rake上。如果要使用现有数据库,则不应更改配置的命名空间和类名。
internal sealed class Configuration : DbMigrationsConfiguration<MyDatabaseContext>
{
    public Configuration ()
    {
        AutomaticMigrationsEnabled = true;
        ContextKey = "MyNamespace.MyDatabaseContext"; // this line was missed
    }

    protected override void Seed(MyDatabaseContext context)
    {
    }
}