首页 文章

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

提问于
浏览
0

我有一个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

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

    据我了解,您的DEV现在领先于PROD,所以您有几个选择:

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

    • 识别模型更改并将其回滚 .

    • add-migration Baseline -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

相关问题