gpt4 book ai didi

c# - 使用基于代码的迁移时,如何停止添加迁移检查我的数据库没有待处理的迁移?

转载 作者:太空狗 更新时间:2023-10-29 20:40:13 25 4
gpt4 key购买 nike

我正在研究使用基于代码的 EF 迁移来实现使用 EF 的产品。一切正常,除了命令:

Add-Migration MyTestMigration

输出以下信息:

Unable to generate an explicit migration because the following explicit migrations are pending: [201206260845338_DannyTest]. Apply the pending explicit migrations before attempting to generate a new explicit migration.

原因是连接字符串在构建时是未知的,并且 EF 在 .\SQLExpress 上随机创建了一个名为“MyContextName”的数据库。我无法应用挂起的迁移,因为它引用了此数据库中不存在的数据库表 - 我们只是尝试使用迁移作为执行脚本的一种方式;

所以问题是:

  1. 如果我们不使用自动迁移(我们有 EnableAutomaticMigrations=false),为什么 Add-Migration 要求数据库是最新的即使它对生成的(空)迁移完全没有影响?我发现很难相信 MS 不打算使用这个用例,因为它的大部分都有效;唯一“损坏”的是不影响任何行为的验证。

  2. 除了创建我们自己的 Add-Migration 命令,它只是复制 EF 所做的事情,但跳过(看似不必要的)数据库最新检查之外,还有什么办法可以解决这个问题吗?我已经尝试传递各种参数,但到目前为止还没有成功。

编辑:

我其实找到了一个更好的方法来解决这个问题,但它并不能真正回答这些问题,所以在这里添加它。希望有时间把它变成一个 blog post !

我想使用 Add-Migration 的唯一原因是因为 DbMigration 带来的所有麻烦;但我意识到,使用基类,我们基本上可以通过让基类从属性自动生成迁移 ID 来消除对所有这些的需要。 Target 对于我们所有的迁移都是相同的,因为模型状态不会改变。现在,我们只需像这样手动创建迁移(构建 ID 需要日期,以便 EF 以正确的顺序应用它们):

[Migration(2012, 6, 27, 12, 00, "Add new xxx fields for yyy")]
internal class MyNewMigration : MyDbMigration
{
public override Up()
{
// ...
}
public override Down()
{
// ...
}
}

MyDbMigration 类具有 Target/Source/Id 属性。 Target 是硬编码的(与第一次迁移时 Add-Migration 创建的值相同),Source 为 null,而 Id 是读取 MigrationAttribute 的某种反射。这意味着我们现在可以手动创建这些类;这不是很多工作,现在我们不必担心所有 IMigrationMetadata 的东西:-)

最佳答案

尝试注释掉您现有的迁移(那些尚未应用于在 .\SQLExpress 上创建的数据库的迁移)并重新运行您的应用程序。这应该用它需要的初始表填充本地数据库。

一旦本地数据库具有正确的结构,您应该能够取消对迁移的注释,然后使用 update-database 使本地数据库保持最新。然后您就可以添加新的迁移。

另请记住,更新数据库命令中有一个 -connectionString 参数,因此您可以将迁移定位到特定的服务器/数据库。

关于c# - 使用基于代码的迁移时,如何停止添加迁移检查我的数据库没有待处理的迁移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com