代码优先迁移找不到现有数据库
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
我有一个 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