2010-07-02 11 views
13

Sto provando a migrare un'applicazione Web esistente per utilizzare RavenDB.RavenDB: generazione di ID per i sottodocumenti

Attualmente ho pagine nella mia applicazione Web che consentono di visualizzare Categorie, Sottocategorie e Risorse basate su un ID nella Querystring.

Tuttavia, noto che RavenDB genera ID per le radici aggregate, ma non per le entità figlio.

Non penso che la sottocategoria sia una radice aggregata (una categoria ha sottocategorie), quindi lo sto rendendo un sotto-documento del mio documento di categoria.

Mi sbaglio per renderlo un sottocodice mentre sto accedendo direttamente dal suo ID passato sulla querystring? Ma se no, come dovrei accedere alle singole sottocategorie dato che RavenDB non sembra generare id per entità che non sono root aggregati?

risposta

15

C'è un long but interesting discussion sulla mailing list Raven su questa esatta situazione.

La risposta breve è che Raven non è progettato per fare ciò, solo le entità root ottengono un id, tutto il resto viene trattato come un tipo di valore. Ma puoi implementarlo da solo, vedi l'esempio di codice alla fine del thread per informazioni.

+0

Grazie Matt. Questo descrive esattamente la mia situazione. Voterò la tua risposta una volta che avrò abbastanza reputazione. – Andy

7

Mi sono imbattuto in questo problema ma non mi sentivo a mio agio nel lasciare che i documenti generassero gli ID perché non ritenevo che fosse thread-safe, in particolare per gli ambienti basati sul web.

Alla fine ho deciso di lasciare che il server di generare l'ID di per me usando un metodo GenerateDocumentKey in questo modo:

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

questo modo sto permettendo al database per generare il bambino ID e posso assicurare che ho vinto Deve tener conto delle condizioni di gara ecc. nella classe stessa.

+2

Si noti che questo è ora 'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey (sc)' –

Problemi correlati