2010-07-02 13 views
13

Próbuję przeprowadzić migrację istniejącej aplikacji internetowej, aby użyć RavenDB.RavenDB: Generowanie Id dla pod-dokumentów

Mam obecnie strony w mojej aplikacji internetowej, które umożliwiają wyświetlanie kategorii, podkategorii i zasobów w oparciu o identyfikator w zapytaniu.

Jednak zauważam, że RavenDB generuje identyfikatory dla zagregowanych korzeni, ale nie dla elementów podrzędnych.

Nie uważam, że podkategoria jest zbiorczym katalogiem głównym (kategoria zawiera podkategorie), dlatego robię z tego pod-dokument mojego dokumentu kategorii.

Czy jestem w błędzie, aby uczynić go pod-dokumentem, ponieważ mam do niego bezpośredni dostęp przez jego identyfikator przekazany w querystringu? Ale jeśli nie, jak mam uzyskać dostęp do poszczególnych podkategorii, ponieważ RavenDB nie wydaje się generować identyfikatorów dla podmiotów, które nie są zagregowanymi źródłami?

Odpowiedz

15

Na liście mailingowej Kruka znajduje się long but interesting discussion o tej sytuacji.

Krótka odpowiedź jest taka, że ​​Raven nie jest zaprojektowany, aby to zrobić, tylko podmioty korzeniowe uzyskać identyfikator, wszystko inne jest traktowane jako rodzaj wartości. Ale możesz to zaimplementować samodzielnie, zobacz przykład kodu na końcu wątku, aby uzyskać informacje.

+0

Dzięki Matt. To dokładnie opisuje moją sytuację. Będę głosował w górę twoją odpowiedź, gdy tylko będę miał dość reputacji. – Andy

7

wpadłem na ten problem, ale nie było wygodne z najmu dokumenty wygenerowania identyfikatora jest tak nie czułem, że to bezpieczne wątek, szczególnie w środowiskach opartych na WWW.

Ostatecznie postanowiłem niech serwer generuje identyfikator dla mnie stosując metodę GenerateDocumentKey tak:

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(); 
} 

ten sposób jestem pozwalając bazy danych w celu wygenerowania dziecko Id i może zapewnić, że wygrałem Muszą uwzględniać warunki wyścigowe itp. w samej klasie.

+2

pamiętać, że jest teraz 'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey (sc)' –

Powiązane problemy