我需要使用迁移将代码首先从一个实体移动到另一个实体。这与Move property to new Entity in Entity Framework Code First Migration类似,但有一个额外的问题:我需要在我的应用程序中发布迁移,以便可以自动迁移具有现有数据的客户。
该问题中接受的答案是将该过程分解为三次迁移:
用于在第二次迁移中移动数据的代码是:
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命令?
答案 0 :(得分:1)
我不会在迁移中使用上下文。相反,我会在迁移中使用它:
Sql(&#34; UPDATE x SET foo = bar&#34;);
然后,您的实体看起来并不重要。
答案 1 :(得分:1)
正如@BigJump指出的那样,在迁移中使用Context可能是不好的做法。 DbMigration.Sql方法允许在迁移中包含任意SQL,并且与使用Context相比有几个优点:
在给出的例子中,声明
Sql("INSERT INTO Locations (Event_Id, City) SELECT Id, City FROM Events");
将在第一次迁移中放在Up方法的底部。