2012-02-07 22 views
7

Estoy usando RavenDb embedded. Como parte de mis pruebas de integración, quiero verificar que los objetos persistan. Cuando SaveChanges en un objeto, luego lo recupero, no se puede encontrar a menos que disponga mi conexión.RavenDB cómo lavar?

esto no funciona para mí, ya que no hay archivos se devuelven

using (var session = _dataDocumentStore.Instance.OpenSession()) 
{ 
     session.Store(file); 
     session.SaveChanges(); 
} 

....

using (var session = _dataDocumentStore.Instance.OpenSession()) 
{ 
      return session.Query<File>().ToList(); 
} 

he creado un método Flush que dispone y recrea un EmbeddableDocumentStore que funciona, pero como esto es algo que se siente fundamental Puedo estar haciendo las cosas mal:

public static IDocumentStore Initialize() 
     { 
      instance = new EmbeddableDocumentStore 
      { 
       DataDirectory = "App_Data/Database", 
       UseEmbeddedHttpServer = true, 


      }; 

      instance.Initialize(); 
      return instance; 
     } 

     public void Flush() 
     { 
      instance.Dispose(); 
      Initialize(); 

     } 

H ¿Cómo persistes en RavenDB y luego compruebas que ha persistido? Cualquier consejo sobre esto sería genial

+0

es que hay una razón que está llamando instance.Initialize(); Está creando una nueva instancia al ingresar al método IDocumentStore Initialize() – MethodMan

+0

¿Qué muestra la base de datos? Verifique Raven Studio para asegurarse de que su salvación funcionó. ¿Está su documento allí? –

Respuesta

15

Básicamente, el EmbeddableDocumentStore toma más tiempo para guardar y Índice que los nuevos datos, que el ahorro y la consulta.

Así que cuando las pruebas dicen: -

  1. tienda y SaveChanges.
  2. Carga.
  3. ¿Esto carga?

la carga completa waaay más rápido de lo que la indexación ha tenido tiempo de terminar.

Así que, como dijo Daniel Lang, tienes que esperar a resultados obsoletos.

PERO ... tendrá que hacer eso en su código para cada consulta que desee verificar. Así que ... permite hacer trampa (legalmente) :)

Dile a tu tienda de documentos SIEMPRE espera los resultados obsoletos, si hay algo que pregunte en la tienda.

¿Cómo?

// Initialise the Store. 
var documentStore = new EmbeddableDocumentStore 
        { 
         RunInMemory = true 
        }; 
documentStore.Initialize(); 

// Force query's to wait for index's to catch up. Unit Testing only :P 
documentStore.RegisterListener(new NoStaleQueriesListener()); 

.... 


#region Nested type: NoStaleQueriesListener 

public class NoStaleQueriesListener : IDocumentQueryListener 
{ 
    #region Implementation of IDocumentQueryListener 

    public void BeforeQueryExecuted(IDocumentQueryCustomization queryCustomization) 
    { 
     queryCustomization.WaitForNonStaleResults(); 
    } 

    #endregion 
} 

#endregion 

ahora para ver esto en acción, echa un vistazo a RavenOverflow @ github. Y el Tests project en esa solución tiene todo el amor es posible que desee :)

enter image description here

+0

++. Para la versión 3: 'documentStore.Listeners.RegisterListener' –

12

La razón es que el índice de cuervos es demasiado obsoleto para devolver algo aquí. Es necesario hacer esto:

session.Query<File>() 
    .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()) 
    .ToList(); 

Para leer más, vaya aquí: http://ravendb.net/docs/client-api/querying/stale-indexes