4

我有一个非常简单的 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 实现中运行代码。但是,这段代码每次都会运行,我无法判断它是否已经运行并且不应该更新记录。

还有其他更好的选择吗?

4

1 回答 1

2

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

于 2013-08-28T18:35:22.280 回答