gpt4 book ai didi

c# - 手动运行 Entity Framework 迁移 Seed() 方法,包括在 Down() 迁移之后

转载 作者:太空狗 更新时间:2023-10-29 23:44:09 25 4
gpt4 key购买 nike

是否有一种简单的方法可以从包管理器控制台手动运行 Entity Framework 迁移 Seed() 方法,包括在 Down() 迁移之后 (Update-Database -TargetMigration foo)? “Run Code First Migration Seed Method without a migration ”的答案解决了如何手动运行 Seed() 方法,即调用 Update-Database,但是当数据库处于旧迁移时这不起作用,不应该更新。在“How to run Seed() method of Configuration class of migrations ”中提出了同样的问题,但它是作为多部分问题的一部分提出的,并且这部分仍未得到回答(尽管整个问题现在被标记为已回答)。

我问是因为我有一些清理代码需要在应用迁移后运行。从 Seed() 调用它对于 Up() 迁移工作正常。不过,我不知道如何轻松调用它进行 Down() 迁移。我想要一个可以从包管理器中使用的简单的一两个衬里。我知道我可以在为所有必要的 DLL 调用 [Reflection.Assembly]::LoadFile() 之后调用 c# 方法,但是有足够多的依赖关系,这会很麻烦并且容易出错。

我知道 Seed() 不是 Down() 迁移清理代码的理想位置(根据 DrewJordan 的回答添加一些上下文),但不幸的是,由于多种原因,使用 Down() 本身是不可行的。从实际的角度来看,这是不可行的,因为清理必须转换几千兆字节的数据,这导致 SQL Server Express 在我尝试在 Down() 中进行简单复制时崩溃,这可能是因为生成的事务大小非常大。其次,即使从假设的角度来看,我也不相信有一种方法可以将数据转换为 Down() 中所需的范围,因为当前的 SQL 行不能作为事务的一部分在 c# 中读取,并且数据的转换需要在 c# 中进行。有关该限制的详细信息,请参阅我的另一个问题:“Transform data using c# during Entity Framework migration ”。需要对设计做出一些妥协才能使清理工作正常进行,我使用 Seed() 作为该妥协。清理代码本身不需要从 Seed() 运行,但我不知道在不更改当前迁移的情况下还可以从包管理器调用什么。

还有另一种情况,在不更改当前迁移的情况下单独调用 Seed() 或其他清理代码会很有用。考虑 Seed()/cleanup 方法中存在错误的场景。您修复了错误并希望在不更改当前迁移的情况下重新运行它。将清理逻辑放在 Down() 中不会解决问题,因为当数据库已经在该迁移中时,不会调用 Down()。

最佳答案

我知道您问过关于从 PM 控制台运行它的问题:据我所知这是不可能的。此用例不是 Seed 的用途:如果您要在 Down 方法中进行更改,我建议您编写要运行的 SQL 脚本,或创建一个上下文在 Down 并在那里做任何事情。

这是个坏主意,因为 Seed 依赖于最新的迁移。例如,它将允许您编写在上下文的先前版本中不可能成功的语句,例如当列被添加到模型但尚未应用于数据库时。我没有尝试过,但它至少会抛出异常,并且可能无法写入任何 更改。

如果你真的,真的认为这是个好主意,你可以在你的配置中添加一个方法:

public void CallSeed()
{
using (var c = new Context()) // create your context
{
Seed(c);
}
}

然后从下调用:

var c = new Configuration();
c.CallSeed();

关于c# - 手动运行 Entity Framework 迁移 Seed() 方法,包括在 Down() 迁移之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35819056/

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