2014-06-13 14 views
6

Ho codice che sembra qualcosa di simile:RavenDB oggetti dinamici

using (var session = DocumentStore.OpenSession()) 
{ 
    var dbItem = session.Load<dynamic>(item.Id);  
    if (dbItem is DynamicJsonObject) 
    { 
     dbItem["PropertyName"] = "new value"; 
    } 
    session.SaveChanges(); 
} 

Quello che non riesco a capire è come aggiornare le proprietà del dbItem.
Qualcuno sa cosa fare? Ho provato ad accedere al nome della proprietà direttamente in questo modo: dbItem.PropertyName Ho anche provato a trasmettere su ExpandoObject, IDictionary e altro. Ma niente sembra funzionare.

risposta

3

Al Raven 2.5, il supporto per gli oggetti dinamici sembra essere principalmente per il lato di lettura di cose, e non è così facile da impostare le proprietà su un oggetto esistente perché Raven.Abstractions.Linq.DynamicJsonObject, che eredita DynamicObject, solo implementa la lettura/invocare metodi del contratto dinamico, come TryGetMember, TryGetIndex e TryInvokeMember. ma nessuno degli articoli come TrySetMember.

Tuttavia, se si trasmette a IDynamicJsonObject, fornisce l'accesso al numero interno RavenJObject che è possibile manipolare.

Questo esempio di codice dovrebbe illustrare come:

using (var session = store.OpenSession()) 
{ 
    dynamic entity = new ExpandoObject(); 
    entity.Id = "DynamicObjects/1"; 
    entity.Hello = "World"; 
    session.Store(entity); 
    session.SaveChanges(); 
} 

using (var session = store.OpenSession()) 
{ 
    var json = session.Load<dynamic>("DynamicObjects/1") as IDynamicJsonObject; 
    json.Inner["Name"] = "Lionel Ritchie"; 
    json.Inner["Hello"] = "Is it me you're looking for?"; 
    session.SaveChanges(); 
} 

using (var session = store.OpenSession()) 
{ 
    dynamic loadedAgain = session.Load<dynamic>("DynamicObjects/1"); 
    Console.WriteLine("{0} says Hello, {1}", loadedAgain.Name, loadedAgain.Hello); 
    // -> Lionel Ritchie says Hello, Is it me you're looking for?" 
} 
+0

soluzione molto semplice. Ho provato molti modi per arrivare a questo oggetto "interiore". Non sapevo che il solo casting di IDynamicJsonObject avrebbe funzionato, grazie. – Quintonn

Problemi correlati