在Entity Framework代码中删除已移动的属性首次迁移

时间:2016-05-06 18:00:02

标签: c# entity-framework ef-migrations

我需要使用迁移将代码首先从一个实体移动到另一个实体。这与Move property to new Entity in Entity Framework Code First Migration类似,但有一个额外的问题:我需要在我的应用程序中发布迁移,以便可以自动迁移具有现有数据的客户。

该问题中接受的答案是将该过程分解为三次迁移:

  1. 添加新属性
  2. 将数据从旧属性移动到新属性
  3. 删除旧属性
  4. 用于在第二次迁移中移动数据的代码是:

    using (var context = new AppContext())
    {
        var events = context.Set<Event>().ToArray();
        foreach (var ev in events)
        {
            ev.Location = new Location { City = ev.City };
        }
        context.SaveChanges();
    }
    

    问题在于,当我删除旧属性以生成第三次迁移时,第二次迁移的代码将不再编译,因为属性ev.City不再存在。

    在第三次迁移中从代码模型和数据库中删除属性的适当技术是什么,同时仍在第二次迁移中移动数据?有没有办法编写第二个迁移代码来移动数据而不引用ev.City?是否有实体框架方法允许我在没有具有该名称的属性的情况下检索ev.City的值,或者我是否需要一直删除到原始SQL命令?

2 个答案:

答案 0 :(得分:1)

我不会在迁移中使用上下文。相反,我会在迁移中使用它:

Sql(&#34; UPDATE x SET foo = bar&#34;);

然后,您的实体看起来并不重要。

答案 1 :(得分:1)

正如@BigJump指出的那样,在迁移中使用Context可能是不好的做法。 DbMigration.Sql方法允许在迁移中包含任意SQL,并且与使用Context相比有几个优点:

  1. 它在服务器上执行,可能更快。
  2. 它会自动进入迁移事务,因此迁移是原子的。
  3. 由于它不需要上下文,因此可以在第一次迁移结束时执行,而不需要单独迁移。
  4. 在给出的例子中,声明

    Sql("INSERT INTO Locations (Event_Id, City) SELECT Id, City FROM Events");
    

    将在第一次迁移中放在Up方法的底部。