在没有迁移的情况下使用EF 6.x.x Code First的优势

时间:2016-06-08 06:52:22

标签: entity-framework entity-framework-6

我厌倦了使用/运行Add-MigrationUpdate-Database,因为很多时候我们忘记在生产数据库上运行迁移。因此,我们决定从数据库表中删除所有迁移以及所有迁移类。那么,如果我的__MigrationHistory表始终为空且没有迁移类,该怎么办?主要缺点是什么?

1 个答案:

答案 0 :(得分:3)

这不是一个坏主意,[__ MigrationHistory]用于将您当前使用的概念模型与存储模型进行比较。

1)案例:自动DbMigrationsConfiguration:

[__ MigrationHistory]跟踪上次迁移。

  this.AutomaticMigrationsEnabled = true;
  this.AutomaticMigrationDataLossAllowed = true;

AutomaticMigrationInDb
如上图所示,migrationId是迁移标识符,model列是当前概念模型的二进制流的base64表示。

2)案例:DbMigrationsConfiguration非自动:

[__ MigrationHistory]跟踪每次迁移。

  this.AutomaticMigrationsEnabled = false;
  this.AutomaticMigrationDataLossAllowed = false;

每个迁移级别都会获得一个migrationId标识符,该标识符用于迁移级别/级别/关闭。

最佳实践:如果您想使用自动迁移,只需重新生成迁移并发送给客户。

如果您使用非自动迁移。 1)如果客户需要数据,那么只需将带有SQL的数据转换为新的数据库模式 2)如果客户不需要数据,则只需删除数据库,然后使用initialCreate再次创建数据。

如果您想在没有任何migrationHistory信息的情况下创建数据库:

        // Create the database. You can generate it from SMO "Script database as" and if the database exist then just ignore the creation
        // Do not forget to remove the [__MigrationHistory] rows.
        DbContext.Database.ExecuteSqlCommand("SQLCreateDbScript.sql");

        Database.SetInitializer<MyDbContext>(null);

        using (var dbContext = new MyDbContext())
        {
            // Create DbContext and it works!
            dbContext.Users.Add(new User());
            dbContext.SaveChanges();
        }

我希望这会帮助你解决问题!

如果你想要的东西真的少用Db-Schema,那么就用EF和NoSql。 在Core版本中仍然没有完成,但使用旧版本的EF6,可以使用:http://www.brightstardb.com(NoSql Db)或使用来自microsoft https://msdn.microsoft.com/en-us/library/dn271399.aspx

的Polyglot appoarch