2

作为迁移我需要修改在一列中的某些现有的数据的一部分,但是这个更新必须使用C#代码被转换:数据必须被读入到C#,改性,然后推回到数据库。EF迁移 - 迁移期间修改现有数据W/C#业务逻辑

这些更改只能在此迁移过程中发生一次。 (因此,即使我检查MigrationHistory表,也有可能在Seed方法中有条件地应用此数据更新,因为可以一次应用多个迁移,并且在稍后迁移后不会发生此更新。)

我在迁移过程中无法使用纯ADO.NET,因为Up()方法仅构建框架将在稍后执行的操作,并且此修改依赖于迁移本身中的架构更改。 (即:vanilla ADO.NET调用会过早发生)。

我觉得最理想的方法是在框架的实际脚本执行过程中有条件地注入BL,但这个可扩展点是不提供。

回答

2

我在迁移过程中无法使用纯ADO.NET,因为Up()方法仅构建稍后将执行的操作,此修改依赖于迁移中的模式更改本身。 (即:vanilla ADO.NET调用会过早发生。)

创建两个迁移。

第一个执行模式更改。

第二个作为空迁移开始。您可以编辑Up()方法来执行修改数据所需的所有C#代码。如果适用,请提供匹配的Down()方法。

请注意,您可以通过编辑第一次迁移,并把你的数据转换代码在Up()方法的结束,反转(如适用)在Down()开始做这一切在一个单一的迁移方法。我发现单独的迁移更清洁。

这些变化不仅要这种迁移

这是由迁徙的机制保证期间发生一次也是唯一。迁移按顺序进行,只有尚未应用到目标数据库的迁移才会运行。

+0

我试着做这一切在一个单一的迁移,但香草ADO.NET代码被称为* *之前,任何在'向上()'方法之前,它的架构修改的。我考虑过第二次迁移,但我主要尝试避免进行3次迁移(在自定义BL运行后需要更多修改)。 – JoeBrockhaus

+0

当我在'Seed()'方法的上下文中提到“在特定迁移过程中只有一次”。由于我无法保证数据库在运行时的版本(即:在TargetMigration + 3之后无法运行),因此我无法在其中执行修改。 – JoeBrockhaus

+0

我们最终只使用了一次迁移,并推迟了模式更改。一些架构的变化是使数据恢复事件坏变换遇到,但我们还是决定放弃,由于这是一个不太可能的边缘情况下(在这种情况下,无论如何) – JoeBrockhaus