我的__MigrationHistory表未隐藏。 EF Code-First是否被禁用?

时间:2013-02-02 08:01:54

标签: asp.net-mvc entity-framework ef-code-first appharbor ef-migrations

我一直在阅读并开始使用Entity Framework Code-First。 它在我的本地机器上工作正常(DefaultConnection),但它似乎已停止在我的生产服务器(AppHarbor的SQL Server插件)上工作。

我注意到的一件事是__MigrationHistory文件夹未作为系统表隐藏。

Screenshot

我一直在使用on AppHarbor's blog所述的自动迁移方法 这是我的DatabaseContext类:

 public class DatabaseContext : DbContext {
      public DatabaseContext() : base("DefaultConnection") { }
      public DbSet<UserProfile> UserProfiles { get; set; }
      public DbSet<Challenge> Challenges { get; set; }
      public DbSet<Feedback> Feedbacks { get; set; }

      protected override void OnModelCreating(DbModelBuilder modelBuilder) {
          Database.SetInitializer(new MigrateDatabaseToLatestVersion<DatabaseContext, Configuration>());
      }
  }  

我想在appharbor数据库上再次使用代码。有没有办法重新启用它,还是应该删除所有生成的迁移类和__MigrationHistory并通过临时更改OnModelCreating构造函数来重新创建数据库以使用DropCreateDatabaseAlways初始值设定项?什么是重置迁移并从当前编写的代码启动迁移的更好方法?

3 个答案:

答案 0 :(得分:3)

当我想用现有的生产系统实现迁移时,我曾经有过这个问题。您可以使用以下T-SQL命令在__MigrationHistory表上设置is_ms_shipped标志。

EXEC sys.sp_MS_marksystemobject __MigrationHistory

答案 1 :(得分:1)

Code First Migrations只是在寻找一个名为__MigrationHistory的表。它不关心它是否被标记为系统表。

在本指南中,您指的是他们使用的是SQL Server CE,如果您使用的是该提供程序,Code First将永远不会将其标记为系统表。

在您的开发计算机上,您可能正在使用不同版本的SQL Server,因此您将其视为系统表。

在某些数据库中将其标记为系统表的原因只是隐藏它。迁移不需要它是系统表才能工作。

您可以在实体框架团队的Arthur Vickers的this博客文章中阅读更多内容,其中他将展示如何使__MigrationHistory成为Sql Server上的非系统表。

答案 2 :(得分:1)

请参阅Julie Lerman撰写的这篇文章:http://thedatafarm.com/blog/data-access/using-ef-migrations-with-an-existing-database/。这不完全是您所描述的内容,但也许“将迁移历史记录表添加到现有数据库”部分可以帮助您