代码首次迁移未找到现有数据库

时间:2016-04-19 11:18:23

标签: c# entity-framework ef-code-first ef-migrations

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

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

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

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

在Configuration.cs下我有

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

在该类库的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>

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

我无法创建更新脚本吗?我是否必须将最初执行的现有迁移作为基准?我是否为如何找到现有数据库配置错误了?

更新

  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;
        }

1 个答案:

答案 0 :(得分:0)

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

据我所知,你的DEV现在领先于PROD,所以你有几个选择:

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

  • 确定您的模型更改并将其回滚。
  • 添加迁移基线 -IgnoreChanges //这将创建当前状态的快照。
  • update-database //添加__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