2010-07-02 7 views
13

J'essaie de migrer une application Web existante pour utiliser RavenDB.RavenDB: Génération d'ID pour les sous-documents

J'ai actuellement des pages dans mon application web qui vous permettent de visualiser les catégories, sous-catégories et des ressources basée sur un identifiant dans le querystring.

Cependant, je remarque que RavenDB génère des identifiants pour les racines agrégées, mais pas pour les entités enfants.

Je ne pense pas que la sous-catégorie est une racine globale (une catégorie a sous-catégories), alors je ne suis en fait un sous-document mon document Catégorie.

Ai-je tort de faire un sous-document je y accéder directement par son id passé dans le querystring? Mais sinon, comment dois-je accéder aux sous-catégories individuelles, car RavenDB ne semble pas générer d'identifiants pour les entités qui ne sont pas des racines agrégées?

Répondre

15

Il y a un long but interesting discussion plus sur la liste de diffusion Raven au sujet de cette situation exacte.

La réponse courte est que Raven n'a pas été conçu pour ce faire, seules les entités racine obtenez un identifiant, tout le reste est traité comme un type de valeur. Mais vous pouvez l'implémenter vous-même, voir l'exemple de code à la fin du thread pour info.

+0

Merci Matt. Cela décrit ma situation exactement. Je voterai votre réponse une fois que j'aurai assez de réputation. – Andy

7

je suis tombé sur ce problème, mais n'a pas été à l'aise avec laisser les documents génèrent les ID que je ne me sentais pas qu'il était thread-safe, en particulier pour les environnements basés sur le Web.

Finalement, j'ai décidé de laisser le serveur générer les id pour moi en utilisant un la méthode GenerateDocumentKey comme ceci:

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

De cette façon, je suis permettant à la base de données pour générer l'enfant id et peut faire en sorte que j'ai gagné Il ne faut pas tenir compte des conditions de course, etc. dans la classe elle-même.

+2

Notez que ceci est maintenant 'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey (sc)' –

Questions connexes