2011-05-03 7 views
9

Estoy usando el patrón de repositorio con Raven DB. Mi interfaz de repositorio es¿Cómo espero a que los resultados se actualicen en RavenDB después de DELETE

public interface IRepository<T> where T : Entity 
{ 
    IEnumerable<T> Find(Func<T, bool> exp); 
    void Delete(T entity); 
    void Save(); 
    ... 
} 

y la aplicación es

public class Repository<T> : IRepository<T> where T : Entity 
{ 
    public IEnumerable<T> Find(Func<T, bool> exp) 
    { 
     return session.Query<T>().Where(exp); 
    } 

    public void Delete(T entity) 
    { 
     session.Delete(entity); 
    } 

    public void Save() 
    { 
     session.SaveChanges(); 
    } 
    ... 
} 

tengo una prueba que marca todas las entidades para su eliminación, guarda los cambios y base de datos de consulta para ver si el recuento resultado es cero

[Test] 
public void DeleteValueTest() 
{ 
    //resolve repository 
    var repository = ContainerService.Instance.Resolve<IRepository<DummyType>>(); 
    Func<DummyType, bool> dummyTypeExpr = item => item.GetType() == typeof(DummyType); 

    //find all entries of dummy types and mark for deletion 
    var items = repository.Find(dummyTypeExpr); 
    foreach (var item in items) 
    { 
     repository.Delete(item); 
    } 
    //commit changes 
    repository.Save(); 


    //populate all dummy types, shall be nothing in there 
    items = repository.Find(dummyTypeExpr); 
    int actualCount = items.Count(); 
    int expectedCount = 0; 

    Assert.AreEqual(expectedCount, actualCount); 
} 

La prueba falla con la salida de muestra

RepositoryTest.DeleteValueTest : FailedExecuting query '' on index 'dynamic/DummyTypes' in 'http://localhost:8080' 
Query returned 5/5 results 
Saving 1 changes to http://localhost:8080 
Executing query '' on index 'dynamic/DummyTypes' in 'http://localhost:8080' 
Query returned 4/5 results 

Expected: 0 
But was: 4 

El problema es que si realizo esta prueba varias veces, los elementos realmente se eliminan (2-3 elementos a la vez). Vi que hay una IDocumentQuery que tiene el método WaitForNonStaleResults.

IDocumentQuery<T> WaitForNonStaleResults(); 

Pero no puedo encontrar en Raven.Client.Lightweight espacio de nombres que fue instalado por NuGet.

Resumiendo ¿Cómo espero hasta que la base de datos se actualice y cómo leo datos recientes? ¿Estoy haciendo algo terriblemente mal? ¡Gracias por tu ayuda!

+0

Parece que el mismo _IDocumentQuery_ interfaz se define de manera diferente en el mismo ** ** espacio de nombres _Raven.Client_. Sin embargo, existen dos ensamblajes diferentes que proporcionan esta interfaz: _Raven.Client.dll_ y _Raven.Client.Lightweight.dll_. NuGet me proporciona la biblioteca posterior. – oleksii

+0

Raven.Client.dll no se ha usado durante varios meses, ¿qué compilación está utilizando? –

+0

En cualquier caso, la respuesta de roja es la correcta –

Respuesta

Cuestiones relacionadas