2016-05-06 25 views
1

我需要使用迁移将代码第一个实体框架属性从一个实体移动到另一个实体。这与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命令?

回答

1

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

Sql(“UPDATE x SET foo = bar”);

然后,无论你的实体是什么样子。

+0

我想你可能是对的,我不得不直接使用SQL,但它比简单的更新更复杂。第二个迁移代码也插入新的实体,所以至少需要一个INSERT ... SELECT语句。这可能比使用上下文更快,但它也更容易出错。感谢您指出Sql函数以用于迁移。 –

+0

@StuartMalone好消息是,在原始SQL中测试非常容易。另外我相信你添加的任何东西都会被包装在一个自动交易中。 – BigJump

1

正如@BigJump指出的,在迁移中使用Context可能是不好的做法。该DbMigration.Sql方法允许包含在迁移任意SQL,并拥有超过使用环境相关的几个优点:

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

在给出的例子中,语句

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

将被放置在第一迁移向上方法的底部。

相关问题