2010-07-02 32 views
13

Estoy intentando migrar una aplicación web existente para usar RavenDB.RavenDB: Id Generation para Sub-Documents

Actualmente tengo páginas en mi aplicación web que le permiten ver categorías, subcategorías y recursos basados ​​en una identificación en la cadena de consulta.

Sin embargo, veo que RavenDB genera identificadores para raíces agregadas, pero no para entidades secundarias.

No creo que la subcategoría sea una raíz agregada (una categoría tiene subcategorías), así que lo estoy convirtiendo en un subdocumento de mi documento de categoría.

¿Me equivoco al convertirlo en un subdocumento porque lo estoy accediendo directamente por su id ingresado en la cadena de consulta? Pero si no, ¿cómo debería acceder a subcategorías individuales ya que RavenDB no parece generar identificadores para las entidades que no son raíces agregadas?

Respuesta

15

Hay un long but interesting discussion en la lista de correo de Raven acerca de esta situación exacta.

La respuesta corta es que Raven no está diseñado para hacer esto, solo las entidades raíz obtienen una identificación, todo lo demás se trata como un tipo de valor. Pero puede implementarlo usted mismo, vea la muestra del código al final del hilo para obtener información.

+0

Gracias Matt. Eso describe mi situación exactamente. Votaré tu respuesta una vez que tenga suficiente reputación. – Andy

7

Me encontré con este problema, pero no me sentía cómodo con dejar que los documentos generaran las ID, ya que no creía que fueran seguras para subprocesos, especialmente para entornos basados ​​en web.

Finalmente decidí dejar que el servidor genera los identificadores para mí utilizando un método GenerateDocumentKey así:

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 esta manera estoy permitiendo que la base de datos para generar la identificación del niño de y puedo asegurar que he ganado tiene que atender las condiciones de carrera, etc. en la clase misma.

+2

Tenga en cuenta que esto ahora es 'Session.Advanced.DocumentStore.Conventions.GenerateDocumentKey (sc)' –