8

オブジェクトにNameフィールドがあり、FirstNameフィールドとLastNameフィールドに分割したいとします。または、住所文字列があり、ジオコーディングが必要なLatフィールドとLngフィールドを追加している可能性があります。等

Up()メソッドとDown()メソッドでDbContextにアクセスできると期待していましたが、(組み込み関数を除いて)見つけることができたのは.Sql()呼び出しだけです。これは、列を追加および削除するには十分ですが、既存のデータを新しい形式に変換するには十分ではありません。

Up()呼び出し内でDbContextを参照するのは安全ですか?または、些細なSQL以上のものを必要とする移行を実装するための別の推奨パターンはありますか?

4

2 に答える 2

0

DbContext内部メソッドは既に新しいモデルを参照しているため使用できませんUpが、データベースはまだ古いモデルをターゲットにしています。

編集:

すべてのデータ移行は、を通じて行う必要がありますSql。たとえば、一時テーブルを作成したり、古いデータを一時テーブルに移動したり、テーブル構造の移行を使用したり、SQL で直接何らかの変換を使用してデータを一時テーブルから元のテーブルに戻したりすることができます。varchar 値の分割は大したことではありません。

于 2012-09-26T08:32:47.620 に答える
0

名前を 2 つの異なるフィールドに分割しようとするのではなく、移行を再考してください。ステージングが最適な場合もあります。変換を実行するには 2 つの方法が考えられます。

移行パス #1: 新しいフィールド、次に古いフィールドを削除

  1. FirstName と LastName の新しいフィールドの移行を作成します。Up() メソッドでは、まだ Name フィールドがあり、それを分割し、First と LastName のフィールドに挿入します。
  2. 別の移行を作成して、古い名前フィールドを削除します。

移行パス #2: 転用と名前の変更

  1. LastName フィールドを追加して移行を作成し、名前を FirstName に変更し、姓のデータを移動し、名前が変更された First/Name フィールドを変更して名のみを保持します。

どちらのパスにも長所と短所があります。また、変換の複雑さに関係なく、目標を達成するために論理的な段階に分割できる必要があります。

于 2014-12-10T18:53:19.353 に答える