2012-08-08 18 views
5

Ecco una semplice classe:RavenDB - perché, quando si interrogano i documenti con Id, .Load <> restituisce il valore e Query <> no?

public class Person 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

Quando ho salvare questo in RavenDB si ottiene qualche Id assinged, dicono che è 1, allora questa rendimenti persona

var person = session.Load<Person>("Person/1") 

ho specificato, ma questo

var person = session.Query<Person>().First(p => p.Id == 1) 

errori e dice che "la sequenza non contiene elementi". Non capisco perché.

risposta

11

Il caricamento dei documenti tramite il loro ID è un ACID operation. In altre parole, nel momento in cui si salva il documento, è disponibile per il recupero.

D'altra parte, l'interrogazione dei documenti segue il concetto no-sql di "consistenza finale". Stai interrogando un indice e quell'indice potrebbe avere o non avere avuto il tempo di compilare completamente.

Nell'esempio, l'indice è ancora obsoleto. Se hai aspettato abbastanza a lungo, la tua query sarebbe tornata correttamente. In alternativa, puoi dire a Raven di aspettare usando la personalizzazione WaitForNonStaleResults, ma questo può avere effetti collaterali pericolosi - specialmente su un indice occupato. Puoi leggere ulteriori informazioni sulle query dell'indice stantio qui: http://ravendb.net/docs/client-api/querying/stale-indexes

In generale, se conosci l'ID del documento, devi sempre usare .Load(). Riservare usando .Query() per cose che in realtà richiederebbero la ricerca dell'indice. Nel tuo caso, una query ragionevole potrebbe essere:

var person = session.Query<Person>().Where(p => p.Name == "Joe").FirstOrDefault(); 
+0

che chiarisce le cose per me. Interrogare su proprietà diverse da Id ha funzionato bene. Non riuscivo a capire che problema di identificazione. Grazie per l'aiuto. – user981375

+0

Le cose vecchie e non aggiornate sono davvero utili. Grazie per averlo precisato. –

Problemi correlati