如果还启用自动代码迁移,为什么我只能启用代码迁移?

时间:2017-06-16 17:24:08

标签: entity-framework ef-migrations

发生了重大变化,因此我们决定重置迁移,但现在如果我们不认为-EnableAutomaticMigrations选项Enable-Migrations不起作用。 我的连接字符串位于我的Web项目中,该项目被设置为启动项目。

这是我们采取的步骤:

首先我们完全删除了Migrations文件夹和数据库。 然后我们这样做:

enable-migrations

我们得到:

  

检查上下文是否以现有数据库为目标......

     

无法更新数据库以匹配当前模型,因为有待处理的数据库   更改和自动迁移已禁用。写入待处理的   模型更改为基于代码的迁移或启用自动迁移。   将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true   启用自动迁移。

我不明白这个错误,没有数据库,没有迁移,它引用了哪些挂起的更改? (我甚至在git中都没有待处理的通道)

如果那么我们

enable-migrations -EnableAutomaticMigrations

它有效,但是当我们遵循它时:

Add-Migration InitialCreation

它创建空InitialCreation迁移,并使用与我的模型对应的表创建数据库。但是这样做我们第一次无法获得用于创建数据库的脚本。我不知道发生了什么。 这似乎是第一次使用一些自动迁移。

为什么我们enable-migrations没有-EnableAutomaticMigrations

更新

在与Steve Green交谈后,我认为添加部分DbContext和Initializer可能很有用

public class ApplicationDatabaseContext : DbContext
    {
        public ApplicationDatabaseContext()
            : base("MyConnectionStringName")
        {
            Database.SetInitializer<ApplicationDatabaseContext>(new ApplicationDataInitializer());

            if (!Database.Exists())
            {
                Database.Initialize(true);
            }
        }

我的DatabaseInitializer:

public class ApplicationDataInitializer : CreateDatabaseIfNotExists<ApplicationDatabaseContext>
    {
        protected override void Seed(ApplicationDatabaseContext context)
        {
            base.Seed(context);

            CreateData(context);
        }

        private void CreateData(ApplicationDatabaseContext context)
        {
            //Add data here
            context.SaveChanges();
        }
    }

1 个答案:

答案 0 :(得分:0)

首先,确保设置了初始化程序MigrateDatabaseToLatestVersion。

其次,您不需要启用自动迁移。要重置迁移,您不必删除整个文件夹(特别是如果您在Configuration()类中完成了一些种子设定或其他自定义)。只需删除单个迁移,然后添加新的基线迁移:

add-migration MyStartPoint -IgnoreChanges

这将在Up()中创建没有代码的快照,因为您实际上并不需要生成用于创建数据库的脚本。所以现在update-database -Script -SourceMigration $InitialDatabase应该创建一个可用于创建新数据库的脚本。

另一种选择是使用类似CreateDatabaseIfNotExist的initializer,这样就可以完成。