【问题标题】:Programmatic data transformation in EF5 Code First migrationEF5 Code First 迁移中的程序化数据转换
【发布时间】:2013-03-29 17:57:00
【问题描述】:

是否可以在 Entity Framework 5 Code First 迁移中进行任何类型的编程数据转换?

有一个执行查询的 Sql() 方法,但它的返回类型为 void,我看不到任何方法可以获取我执行的查询的结果。

示例

我的表 RecipeIngredient 具有一对多的关系。由于各种原因,我想将其转换为成分 JSON 字符串属性。我能想到的唯一方法是这样的:

  • 创建新列IngredientsJson
  • 对于每个配方,查询其成分,以编程方式构造 JSON 字符串并插入到新列中。
  • 删除旧表成分

【问题讨论】:

  • 我想我会在 Seed 方法中进行转换,只在新代码中使用新列(s/tables,...),并将旧数据库对象的删除留到下一次迁移.我在升级中混合 DML 和 DDl 的经历很糟糕。除此之外,在新版本中提供旧数据(尽管不可见)是一种安全的感觉,因为转换可能总是会引入意外的错误甚至数据丢失。还有一个问题:为什么要获取查询结果
  • 这个想法是获取 Sql() 命令的结果,我在其中查询配方的成分,以便以编程方式将其转换为 JSON 成分数组。谢谢你的建议。我在您的方法中看到的一个问题是,在迁移到删除成分表的步骤之前,我需要确保在所有数据库上至少运行了一次 Seed()。我只是认为这是很容易忘记的事情,因此我希望将数据转换作为迁移步骤的一部分。它只是更有意义,在我的脑海中似乎更强大。
  • 是的,我可以看到。我宁愿安全也不愿后悔,JIRA 是我的记忆。也许其他人对您的场景有经验。这个有趣的问题还有更多方面。不知道你是否也应该在 Down 方法中提供反向转换?
  • 是的,我相信提供向后数据转换也是一个好主意。我确实喜欢尽可能保持无损迁移链的想法。我不确定是否有不可能的情况?

标签: entity-framework entity-framework-5 database-migration entity-framework-migrations


【解决方案1】:

您应该将 db 'initializer' 用于您想要的 - 和/或某种“种子”(关于在哪里注入 EF 流)。

您可以 > take a look at this post with a customized < initializer - 同时执行 Db Create... 和迁移。它不是剪切和粘贴解决方案,但大多数情况下都有效(这只是解决问题的快速方法,您需要进行一些调整,它在下面有几个修复)。

MigrateDatabaseToLatestVersion 仅对迁移部分进行剂量-您需要seed-ing 暴露-或手动包装该部分(重点是针对不同情况进行的“检查”-即何时“参与”迁移-或播种)。

迁移应该首先进行,而 db 'creation' 类型没有多大意义,除了播种。

您覆盖Seed(您创建)以将任何数据库处理放在那里-您已经暴露了DbContext-如果需要,您还可以调用SqlQuery


How to create initializer to create and migrate mysql database?

【讨论】:

  • 感谢您的意见。我认为这个建议与@Gert Arnold 对我的问题的 cmets 一致,据我所知,仍然存在相同的挑战,以确保在适当的迁移步骤之后运行正确的播种。老实说,我认为 Seed() 应该用于播种数据,因此得名,并且数据转换是迁移步骤的自然组成部分。这只是我认为的方式更有意义。不过我可能弄错了。
  • 实际上是这样——你可以把它叫做别的东西:) 我想说的是,为了混合迁移/播种——你需要一个自定义的初始化程序。这就是place,它应该在的地方。然后(就像我做的那样)在那里 - 你可以'组成'你自己的'StructureSeed' - 都是一样的 - 无论如何这不再是'种子' - 你有一个具有自己规则的新初始化程序。
  • 另外——如果使用DbMigrator,你不能真正改变它是如何做这部分的。所以迁移器确实 - 迁移脚本中有什么(你可以在那里改变东西,但不是你想要的)。在那之后是'你修补'数据库结构 - 表/键等 - 或数据 - 只要它在开始就无关紧要。请记住 - 仅在“空数据库”或无数据库情况下执行此操作。
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2016-11-06
  • 2015-04-01
  • 1970-01-01
相关资源
最近更新 更多