0

我一直在阅读并开始使用 Entity Framework Code-First。它在我的本地机器(DefaultConnection)上运行良好,但它似乎已经停止在我的生产服务器上运行(来自 AppHarbor 的 SQL Server 插件)。

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

截屏

我一直在使用AppHarbor 的博客上描述的自动迁移方法。
这是我的 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初始化程序来重新创建数据库?重置迁移并从当前编写的代码开始它们的更好方法是什么?

4

3 回答 3

3

不久前,当我想使用现有生产系统实施迁移时,我遇到了这个问题。您可以使用以下 T-SQL 命令在 __MigrationHistory 表上设置 is_ms_shipped 标志。

EXEC sys.sp_MS_marksystemobject __MigrationHistory
于 2013-05-09T00:35:59.613 回答
1

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

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

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

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

您可以在 Entity Framework 团队的 Arthur Vickers 的这篇博文中阅读更多内容,他在其中展示了如何使 __MigrationHistory 成为 Sql Server 上的非系统表。

于 2013-02-02T09:41:21.587 回答
1

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

于 2013-02-02T12:21:06.783 回答