c# - EF 迁移 - 在迁移期间使用 C# 业务逻辑修改现有数据

标签 c# entity-framework migration database-migration entity-framework-migrations

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

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

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

我觉得实现这一目标的最理想方法是在框架的实际脚本执行期间有条件地注入(inject)我们的 BL 的工具,但 afaik 没有提供这个扩展点。

最佳答案

I'm unable to using plain ADO.NET during the migration because the Up() method merely builds up the operations that the framework will execute at a later time, and this modification relies on schema changes in the migration itself. (ie: the vanilla ADO.NET calls would happen prematurely.)

创建两个迁移。

第一个执行架构更改。

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

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

These changes must only happen once and only during this migration

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

关于c# - EF 迁移 - 在迁移期间使用 C# 业务逻辑修改现有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33110302/

相关文章:

c# - 反序列化到列表

mysql - 通过 Entity Framework 将具有指定主键的记录插入 MySQL

c# - 如果无法安全地用于生产并且无法描述索引之类的东西,为什么我应该首先使用 Entity Framework 代码

mysql - 迁移后比较不同数据库的表

mysql - 将 .sql 文件从 MSSQL 导入 MySQL

c# - Microsoft Bot Framework 未授权错误

c# - 使用通用 C# 接口(interface)作为类属性

c# - 我如何从 C# 中的选定内容中排序

c# - Entity Framework (edmx)中列出的表的映射应该是什么

mysql - 通过迁移向导将 QODBC 连接到 MySQL 时出错