2012-09-04 16 views
5

Fluentmigratorを使用してテーブルに新しい列を追加しています。私はテーブルの各行をその列の一意の値で更新したいと考えています。FluentMigratorを使用して行ごとに新しい値を更新する

は、現在、私が使用している場合:それはすべての行に同じ値を与える

Update.Table("Foo").InSchema("dbo").Set(new { Bar = Bar.Generate() }).AllRows(); 

行ごとにそのメソッドを確実に呼び出す方法を教えてください。

答えて

7

Bar.Generateは何をしているのか分かりませんが、GUIDまたは一意のIDを作成すると思います。

そうなら、あなたは使用することができます:

Execute.Sql("update dbo.Foo set Bar = NEWID()"); 

それともシーケンシャルGUIDをしたいならば、あなたはNEWSEQUENTIALID()を使用することができます。

あなたはこのユニークなidentierのために新しい列を追加する場合は、その後、あなたがする必要があるだろう、すべてが新しい列を指定.AsGuidである()

EDIT:FluentMigratorが小さい流暢DSLで、カバーするものではありませんこのような複雑なケース。 1つのSQL UPDATEでこれを行う方法はありません(私が知る限り)ので、FluentMigratorで簡単に行うことはできません。 ADO.NETまたはORM(Dapper/NHibernate)を使用してテーブルの行数を取得し、各行をループし、カスタム一意識別子を持つBar列を更新する必要があります。したがって、100万行がある場合は、100万回のSQL更新を行う必要があります。 012.またはthisのようなNEWID()関数に基づくSql関数としてBar.Generate()メソッドを書き換えることができれば、それを1つのUPDATEステートメントとして実行し、FluentMigratorのExecute.Sqlメソッドで呼び出すことができます。

あなたが作業しているデータベースについて言及していません。しかし、Postgresのようなものにはnon-standard featuresがあります。

+0

独自の「フレンドリーな」文字列を作成する独自の関数です。ごめんなさい。 – shenku

+2

関数をSQL関数として書き直すことはできますか?それ以外の場合は、テーブルのすべての行をループする必要があります。 –

+1

あなたのコード例では、キーワード 'table'はそこにあってはならないことに注意してください。コマンドは実行されません。実際のテーブル名に置き換えてください。 – shanabus

関連する問題