2017-11-16 10 views
0

データベースに既に既存のデータがある場合、RavenDbのモデルの名前を変更する簡単な方法はありますか?私はもともと別の言語で作成された様々なモデルを持っていますが、今ではコードベースがかなり維持されなくなっているので、それらの名前を英語に変更したいと思います。名前を変更しただけでは、プロパティがもう一致しないため、データはロードされません。RavenDbを使用しているときに既存のデータを持つデータベースのモデル名を変更

最初の読み込み時にシステムが自動的に実行します。どのようにこれにアプローチするための最善の方法はありますか?私のソリューションは、次のようになります。

  1. チェック文書はアップグレードが行われていない場合は、アップグレードがフィールドにあることを知って
  2. 更新ドキュメントを更新するために、パッチスクリプトを実行し、
  3. 行わされたかどうかを決定するために存在している場合アップグレードが完了しました

答えて

1

古い文書から新しい文書を作成することをお勧めします。

これは、docStore.UpdateByIndexでパッチを適用することで簡単に行うことができます。

私は古い型名Fooを持ち、それを新しい型名Barに名前を変更したいとします。そして、すべてのIDをFoos/123からBars/123に変更したかったのです。

それはこのようになります:

var patchScript = @" 
    // Copy all the properties from the old document 
    var newDoc = {}; 
    for (var prop in this) { 
     if (prop !== '@metadata') { 
      newDoc[prop] = this[prop]; 
     } 
    } 

    // Create the metadata. 
    var meta = {}; 
    meta['Raven-Entity-Name'] = newCollection; 
    meta['Raven-Clr-Type'] = newType; 

    // Store the new document. 
    var newId = __document_id.replace(oldCollection, newCollection); 
    PutDocument(newId, newDoc, meta); 
"; 

var oldCollection = "Foos"; 
var newCollection = "Bars"; 
var newType = "KarlCassar.Bar, KarlCassar"; // Where KarlCassar is your assembly name. 
var query = new IndexQuery { Query = $"Tag:{oldCollection}" }; 
var options = new BulkOperationOptions { AllowStale = false }; 
var patch = new ScriptedPatchRequest 
{ 
    Script = patchScript, 
    Values = new Dictionary<string, object> 
    { 
     { nameof(oldCollection), oldCollection }, 
     { nameof(newCollection), newCollection }, 
     { nameof(newType), newType } 
    } 
}; 

var patchOperation = docStore.DatabaseCommands.UpdateByIndex("Raven/DocumentsByEntityName", query, patch, options); 
patchOperation.WaitForCompletion(); 

は、起動時に一度そのコードを実行し、あなたのアプリケーションは、新しい名前のエンティティで作業することができます。古いエンティティはまだ残っています。これらのエンティティはStudio経由で安全に削除できます。

関連する問題