C# EF迁移-在迁移过程中修改现有数据,包括业务逻辑

C# EF迁移-在迁移过程中修改现有数据,包括业务逻辑,c#,entity-framework,migration,database-migration,entity-framework-migrations,C#,Entity Framework,Migration,Database Migration,Entity Framework Migrations,作为迁移的一部分,我需要修改列中的一些现有数据,但此更新必须使用C#代码进行转换:数据必须读入C#,修改,然后推回数据库 这些更改只能在迁移期间发生一次。(因此,即使我检查了MigrationHistory表,有条件地在Seed方法中应用此数据更新也不会起作用,因为一次可以应用多个迁移,并且此更新不能在以后的迁移之后发生。) 在迁移过程中,我无法使用普通的ADO.NET,因为Up()方法只构建框架稍后将执行的操作,而这种修改依赖于迁移本身中的模式更改。(即:香草ADO.NET调用将过早发生。)

作为迁移的一部分,我需要修改列中的一些现有数据,但此更新必须使用C#代码进行转换:数据必须读入C#,修改,然后推回数据库

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

在迁移过程中,我无法使用普通的ADO.NET,因为
Up()
方法只构建框架稍后将执行的操作,而这种修改依赖于迁移本身中的模式更改。(即:香草ADO.NET调用将过早发生。)

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

我无法在迁移过程中使用普通的ADO.NET,因为Up()方法只构建框架稍后将执行的操作,而这种修改依赖于迁移本身中的模式更改。(即:香草ADO.NET调用将过早发生。)

创建两个迁移

第一个执行模式更改

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

请注意,通过编辑第一次迁移并将数据转换代码放在
Up()
方法的末尾,以及将反转(如果适用)放在
Down()方法的开头,您可以在一次迁移中完成所有这一切。我发现单独迁移更干净

这些更改只能在迁移期间发生一次


迁移机制保证了这一点。迁移是按顺序应用的,只有未应用到目标数据库的迁移才会运行。

我尝试在一次迁移中完成所有迁移,但在
Up()
方法中对之前的任何架构修改之前,都调用了普通的ADO.NET代码。我考虑过第二次迁移,但我主要是试图避免进行3次迁移(在自定义BL运行后需要更多修改)。当我提到“一次&仅在特定迁移期间”,我的意思是在
Seed()
方法的上下文中。由于我无法保证数据库运行时将处于哪个版本(即:在TargetMigration+3之后无法运行),因此我无法在那里执行修改。我们最终只使用了一次迁移,并将架构更改推迟到迁移之后。一些模式更改是为了在遇到错误转换时启用数据恢复,但我们决定放弃,因为这是一种非常不可能的边缘情况(无论如何,在本例中),这个想法听起来很好,但如果您更改模型并尝试创建新的DB,它就会崩溃。详情如下: