如何在Entity Framework数据库迁移期间运行自定义代码?

时间:2013-08-28 18:29:34

标签: c# .net entity-framework

我有一个非常简单的Entity Framework 5 DbMigration,它将一个新的布尔列添加到一个包含数千条记录的现有表中。我希望根据同一个表中另外两列中的值来设置每个现有行的该列的初始值。这应该只影响现有记录,因此只应在执行迁移时运行,并且永远不会再次运行。

这基本上是需要执行的逻辑:

var users = (from u in context.Users select u).ToList();
users.ForEach(u =>
{
    u.MyNewBoolColumn = (u.Column1 != null && u.Column2 == "some-value");
    context.Users.AddOrUpdate(u);
});

我可以想到两种选择,但我不喜欢其中任何一种:

  1. 创建两个单独的迁移,因为该列在第一个完成之后才会存在。这似乎很草率,我也不确定如何在第二次迁移中获取数据库上下文以实际执行更新。
  2. 在DbMigrationsConfiguration实现中运行代码。但是,此代码每次都会运行,我无法判断它是否已经运行且不应更新记录。
  3. 还有其他更好的选择吗?

1 个答案:

答案 0 :(得分:2)

迁移表示schema中的更改,因此您无法在迁移中使用AddOrUpdate()内容。但你可以,这就是我建议你使用Sql()方法运行纯SQL代码。