代码优先迁移找不到现有数据库

Code first migration not finding existing database

我有一个 DBContext 对象,它包含我所有数据库对象的定义。当我第一次 运行 应用程序时,它创建了数据库。现在正在制作中。

我现在需要在 DEV 中进行模型更改,因此需要使用 Code First Migrations 生成一个 SQL 脚本,以便在我发布时在 prod 中进行所需的架构更改。

据我所知,我可以使用 add-migration 命令添加一个新的迁移,它会将我现有数据库中的内容与模型定义进行比较,并为我生成一个脚本,让我可以更新数据库.但是,当我 运行 添加迁移命令时,它会为我生成一个迁移,它是一个完整的数据库创建,而不仅仅是新对象。

我的数据库对象在一个单独的 class 库中,我打开了包管理器控制台,选择默认项目作为我的数据库 class 库。

在Configuration.cs下我有

  internal sealed class Configuration : DbMigrationsConfiguration<Centrica.EMT.Database.Context.EmtDataContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
            ContextKey = "Centrica.EMT.Database.Context.EmtDataContext";
        }

在那个 class 库的 app.config 中,我有

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <connectionStrings>
    <add name="Centrica.EMT.Database.Context.EMTDataContext" connectionString="Initial Catalog=EMTProd;Data Source=WYCVWWEBD016\COMPUTECLUSTER;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

但它似乎没有找到该数据库并生成更新脚本,它只是在我创建新迁移时为我创建了一个 b运行d 新的完整数据库创建脚本。

我无法创建更新脚本吗?我是否必须首先执行现有迁移作为基线?我是不是配置错了如何查找现有数据库?

已更新

  public class EmtDataContext : DbContext
    {
        public EmtDataContext()
        {
            //todoSystem.Data.Entity.Database.SetInitializer(new CreateDatabaseIfNotExists<EmtDataContext>());
            var objectContextAdapter = this as IObjectContextAdapter;
            var objectContext = objectContextAdapter.ObjectContext;
            objectContext.CommandTimeout = Database.Connection.ConnectionTimeout;
        }

迁移不会查看数据库来确定脚本 - 它们会查看上次迁移并进行比较。如果没有先前的迁移,您将获得整个数据库的脚本。解决这个问题的方法是 "add-migration Baseline -IgnoreChanges" ,它只更新快照而不生成代码。然后所有后续迁移都将是新对象。 EF 在数据库中查看的唯一内容是 __MigrationHistory table 以查看是否已应用迁移。

据我了解,您的 DEV 现在领先于 PROD,因此您有几个备选方案:

1) 在模型更改之前建立基线:

  • 确定您的模型更改并将其回滚。
  • 添加迁移基线 -IgnoreChanges // 这将创建当前状态的快照。
  • 更新数据库 // 添加 __MigrationHistory 并插入记录。
  • 重新应用您的模型更改,添加迁移将 现在只包含更改。

2) 执行添加迁移,这将编写所有对象的脚本。你可以发表评论 取出已经存在的对象并将其余对象应用到 PROD。

https://msdn.microsoft.com/en-US/data/dn481501

至于生产,对于是否应该运行 迁移到 PROD 数据库,您会得到不同的意见。我们的 DBA 拒绝了,所以我们只是给他们生成的脚本。参见 http://cpratt.co/migrating-production-database-with-entity-framework-code-first/#at_pco=smlwn-1.0&at_si=54ad5c7b61c48943&at_ab=per-12&at_pos=0&at_tot=1