2013-01-03 2 views
5

UniqueConstraints-bundle을 사용하는 Organization이라는 이름의 엔티티가 있습니다. 우리는 NetName이라는 이름의 UniqueConstraint라는 속성과 자동 생성 된 Id를 가지고 있습니다.RavenDB의 Id 값 변경

이것은 불필요한 것이므로 Id 대신 NetName-property를 사용하고 싶습니다. UniqueConstraints가 고유하다는 것을 알기 위해 UniqueConstraints가 필요 없으며 NetName이있을 때 Load를 사용할 수 있다는 이점도 얻습니다.

우리는 그래서 우리는 지금의 가치 ​​보유 TempUniqueNetName라는 새로운 임시 특성 만든 아이디로 사용하기 전에 우리의 네트 조금 정리하는 데 필요한 :

"organizations/"+ CleanupId(this.NetName) 

그래서 우리가 지금 준비를 간단하게 그 값을 우리 이드에게로 옮기십시오. 그러나 우리는 그것을 작동시킬 수 없습니다. 우리의 문제는 아래의 PatchRequest를 사용하면 데이터베이스에 ID라는 새 속성이 생기지 만 실제 ID는 여전히 동일한 값을 갖습니다 (스크린 샷 참조). ID의 값을 변경하는 더 나은 (올바른) 방법이 있습니까?

기업은 :

class Organization { 
    public string Id { get; set; } 

    [UniqueConstraint] 
    public string NetName { get; set; } 

    public string TempUniqueNetName{ get; set; } 
} 

우리는 같은 것을 할 할 :

_documentStore.DatabaseCommands.UpdateByIndex(typeof(Organizations).Name, 
      new IndexQuery(), 
      new[] 
        { 
         new PatchRequest() 
          { 
           Type = PatchCommandType.Rename, 
           Name = "TempUniqueNetName", 
           Value = new RavenJValue("Id") 
          } 
        }); 

Value has not changed

답변

5

난 당신이 패치를 통해 문서 키를 변경할 수 있다고 생각하지 않습니다. 실제로 문서 나 메타 데이터와 함께 저장되지는 ​​않습니다.로드시 @id 메타 데이터에 복사되어 Raven Client가 문서의 자신의 ID 속성으로 다시 복사합니다. 하지만 실제로는 기본 esent 문서 저장소에서 별도의 가치입니다. 까마귀는 이것을 어떻게 처리하고 당신을 위해 그것을 가짜로 써야하는지 구체적으로 알아야 할 것입니다.

수동으로 이전 ID에서 새 ID로 문서를 복사하고 이전 ID를 삭제할 수 있지만 시간이 오래 걸릴 수 있습니다.

지금은 문서 키의 이름을 바꾸는 데는 답이 없습니다. 하나의 문서를 다시 키잉 할 수있는 DatabaseCommand가 있어야하며 패치 할 때 PatchCommandType을 다시 키로 구분해야합니다. 아마도 이것은 앞으로 까마귀에 추가 될 것입니다.

+0

게시 요청 여기 : http://issues.hibernatingrhinos.com/issue가/RavenDB-801 –

+0

네, 감사합니다. 아마도 귀하의 제안을 사용하고 의사를 복사 할 것입니다. 그것은 한 시간 일 뿐이므로 시간이 걸릴 것 같지 않습니다. 바라건대 다음에 우리가 이것을 필요로 할 때 구현 될 것입니다. –

+1

FYI : RavenDB 개발자는이 기능을 추가하지 않고 대신 "사용자가 트랜잭션 삭제/삽입 쌍으로 쉽게 구현할 수 있다고 응답했습니다. . " –