【问题标题】:Deleting a moved property in Entity Framework code first migration在实体框架代码第一次迁移中删除移动的属性
【发布时间】:2016-05-06 18:00:01
【问题描述】:

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

该问题中公认的答案是将过程分为三个迁移:

  1. 添加新属性
  2. 将数据从旧属性移至新属性
  3. 删除旧属性

第二次迁移中用于移动数据的代码是:

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 命令?

【问题讨论】:

    标签: c# entity-framework entity-framework-migrations


    【解决方案1】:

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

    Sql("UPDATE x SET foo=bar");

    那么,你的实体长什么样并不重要。

    【讨论】:

    • 我认为您可能是对的,我必须直接使用 SQL,但它比简单的 UPDATE 更复杂。第二个迁移代码也是插入新实体,因此至少需要一个 INSERT ... SELECT 语句。这可能比使用上下文更快,但也更容易出错。感谢您指出用于迁移的 Sql 函数。
    • @StuartMalone 好消息是它很容易在原始 SQL 中进行测试。另外,我相信您添加的任何内容都会包含在自动交易中。
    【解决方案2】:

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

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

    在给出的例子中,语句

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-29
      • 2014-09-25
      • 2012-11-29
      • 2016-03-29
      • 2016-03-05
      • 2015-06-07
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多