Entity framework MigrateDatabaseToLatestVersion和dbo.\u迁移历史记录
我正在尝试部署一个使用EF5 codefist和迁移构建的MVC4应用程序 我希望在将来使用新迁移部署应用程序的新版本时,应用程序更新数据库,因此在Global.asax中,我执行以下操作: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
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)
{
}
}