2010-07-02 4 views
13

RavenDB를 사용하도록 기존 웹 응용 프로그램을 마이그레이션하려고합니다.RavenDB : 하위 문서 용 ID 생성

현재 웹 응용 프로그램에 쿼리 문자열의 ID를 기반으로 카테고리, 하위 카테고리 및 리소스를 볼 수있는 페이지가 있습니다.

그러나 RavenDB는 집계 루트에 대한 ID를 생성하지만 하위 엔티티에 대해서는 생성하지 않습니다.

하위 범주가 집계 루트 (하위 범주가있는 범주)라고 생각하지 않으므로 내 범주 문서의 하위 문서로 만듭니다.

내가 그것을 쿼리 문법에 전달 된 ID로 직접 액세스하므로 하위 문서로 만드는 것이 잘못 되었습니까? 그러나 그렇지 않다면 RavenDB는 집계 루트가 아닌 엔티티에 대한 ID를 생성하지 않는 것처럼 개별 하위 카테고리에 어떻게 액세스해야합니까?

답변

15

정확한 상황에 대해 Raven 메일 링리스트에는 long but interesting discussion이 넘습니다.

짧은 대답은 Raven이 이것을하기 위해 설계되지 않았으며 루트 엔티티 만이 id를 얻었고 다른 모든 것은 값 유형으로 취급된다는 것입니다. 하지만 직접 구현할 수도 있습니다. 정보 끝에 대한 스레드의 끝에있는 코드 샘플을 참조하십시오.

+0

감사합니다. Matt. 그건 내 상황을 정확하게 묘사 한거야. 충분한 평판을 얻었 으면 대답 해 주겠다. – Andy

7

이 문제가 발생했으나 특히 웹 기반 환경에서 스레드 안전하다고 느끼지 않아서 문서가 ID를 생성하도록 허용하는 데 어려움이있었습니다. 나는 아이 ID를 생성하기 위해 데이터베이스를 수 그리고 난 원하도록 할 수 있습니다

using (var session = Store.OpenSession()) 
{ 
    if(category.SubCategories != null) 
    { 
     var newSubCategories = data.BankAccounts.Where(x => string.IsNullOrEmpty(x.Id)); 
     foreach (var sc in newSubCategories) 
      sc.Id = session.Advanced.Conventions.GenerateDocumentKey(sc);  
    } 

    session.Store(data); 
    session.SaveChanges(); 
} 

이 방법 :

은 결국 나는 서버가 상기 GenerateDocumentKey 방법과 같이 사용하는 나를 위해 아이디의를 생성 할 수 있도록 결정 실제 수업 자체에서 경쟁 조건 등을 고려해야합니다.

+2

이제 이것이 'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey (sc)'가되었습니다. –