2012-09-26 58 views
7

假设我的对象有一个Name字段,并且我希望将它分成FirstName和LastName字段。或者,也许它有一个地址字符串,我要添加需要地理编码的Lat和Lng字段。等等如何编写转换数据的实体框架迁移(最好使用DbContext)?

我希望能够在Up()和Down()方法中访问我的DbContext,但是我所能找到的(除了内置函数之外)都是.Sql()调用。这足以添加和删除列,但不适用于将现有数据转换为新格式。

在Up()调用中引用我的DbContext是否安全?或者是否有另一种推荐的模式用于实施迁移,需要的不仅仅是微不足道的SQL?

回答

0

不,您不能在Up方法中使用DbContext方法,因为它已经引用了新模型,但是您的数据库仍然以旧模型为目标。

编辑:

所有数据迁移都必须通过Sql完成。例如,您可以创建临时表,将旧数据移动到临时表,使用表结构的迁移并将数据从临时表移回到原始数据库,直接在SQL中使用一些转换 - 分割varchar值应该不是什么大问题。

+2

我所需的转换不能像SQL一样完成(分割变量是一个极其简单的例子)。这种迁移操作在像ActiveRecord这样的鸭式ORM中非常自然,但是这是EF方法会遇到麻烦的一个区域。 – Seth

0

而不是试图将名称拆分为两个不同的字段,请重新考虑您的迁移。有时它可能是最好的阶段。我可以想到两种方法来执行转换。

迁移路径#1:新领域,然后删除旧

  1. 创建的名字和姓氏的新领域迁移,并在向上()方法,你仍然有Name字段,把它分解,插入第一个和最后一个字段。
  2. 创建另一个迁移以删除旧名称字段。

迁移路径#2:重新设计和重新命名

  1. 创建迁移将姓氏字段,并重新命名的名称,名字,移动姓数据,修改重命名的第一个/ Name字段只有名字。

两条路径都有优点和缺点。无论您的转型的复杂程度如何,您都应该能够将其划分为逻辑阶段来完成目标。

相关问题