fluentmigrator を使用して新しい列をテーブルに追加しています。次に、テーブルの各行をその列の一意の値で更新したいと考えています。
現在私が使用するとき:
Update.Table("Foo").InSchema("dbo").Set(new { Bar = Bar.Generate() }).AllRows();
すべての行に同じ値を与えます。
各行に対してそのメソッドを確実に呼び出すにはどうすればよいですか?
fluentmigrator を使用して新しい列をテーブルに追加しています。次に、テーブルの各行をその列の一意の値で更新したいと考えています。
現在私が使用するとき:
Update.Table("Foo").InSchema("dbo").Set(new { Bar = Bar.Generate() }).AllRows();
すべての行に同じ値を与えます。
各行に対してそのメソッドを確実に呼び出すにはどうすればよいですか?
Bar.Generate が何をするのかはわかりませんが、GUID または一意の ID を作成すると推測しています。
もしそうなら、あなたは使うことができます:
Execute.Sql("update dbo.Foo set Bar = NEWID()");
または、連続した GUID が必要な場合は、NEWSEQUENTIALID()を使用できます。
この一意の識別子に新しい列を追加する場合は、新しい列 .AsGuid() を指定するだけです。
編集: FluentMigrator は小さな流暢な DSL であり、このような複雑なケースをカバーするためのものではありません。1 つの sql UPDATE でこれを行う方法は (私の知る限り) ないため、FluentMigrator で簡単に行う方法はありません。ADO.NET または ORM (Dapper/NHibernate) を使用してテーブルの行数を取得し、各行をループして Bar 列をカスタムの一意の識別子で更新する必要があります。したがって、100 万行ある場合は、100 万回の SQL 更新を行う必要があります。Bar.Generate() メソッドを NEWID() 関数に基づく Sql 関数として書き直すことができる場合は、これを1つの UPDATE ステートメントとして実行し、FluentMigrator の Execute.Sql メソッドで呼び出すことができます。
使用しているデータベースについては言及していません。しかし、Postgres のようなものには、役立つ非標準機能があります。