2017-11-16 6 views
0

데이터베이스에 이미 데이터가있는 경우 RavenDb에서 모델 이름을 바꾸는 '쉬운 방법'이 있습니까? 나는 원래 다른 언어로 만들어진 다양한 모델을 가지고 있으며, 이제는 코드베이스가 꽤 유지하기 어려워지면서 영어로 이름을 바꾸고 싶습니다. 방금 이름을 바꾸면 속성이 더 이상 일치하지 않기 때문에 데이터가로드되지 않습니다.RavenDb를 사용할 때 기존 데이터가있는 데이터베이스에서 모델 이름 바꾸기

첫 번째로드시 시스템이 자동으로 수행하기를 원합니다. 이 방법에 접근하는 가장 좋은 방법이 있습니까? 내 솔루션은 다음과 같습니다

  1. 확인 문서가 업그레이드가 완료되었는지 확인하기 위해 존재 또는 업그레이드가 완료되지 않은 경우
  2. 는, 패치 스크립트 필드를 알고
  3. 업데이트 문서를 업데이트 실행하지 않을 경우 업그레이드가 완료되었습니다.

답변

1

이전 문서에서 새 문서를 만드는 것이 좋습니다.

docStore.UpdateByIndex을 통한 패치를 사용하면 쉽게 처리 할 수 ​​있습니다.

예를 들어 이전 형식 이름 인 Foo가 있고 새 형식 이름 인 Bar로 이름을 바꾸려고한다고 가정합니다. Foos/123에서 Bars/123으로 모든 ID를 변경하기를 원했습니다. 한 번 시작시 코드

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를 통해 안전하게 삭제할 수 있습니다.

관련 문제