2014-06-13 12 views
6

Mam kodu, który wygląda mniej więcej tak:RavenDB obiekty dynamiczne

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

Nie mogę dowiedzieć się, jak zaktualizować właściwości dbItem.
Czy ktoś wie, co robić? Próbowałem uzyskać dostęp do nazwy nieruchomości bezpośrednio w następujący sposób: dbItem.PropertyName Próbowałem również odlewania do ExpandoObject, IDictionary i innych. Ale nic nie działa.

Odpowiedz

3

Począwszy od Raven 2.5, obsługa dynamicznych obiektów wydaje się być głównie przeznaczona do czytania. Nie jest łatwo ustawić właściwości istniejącego obiektu, ponieważ Raven.Abstractions.Linq.DynamicJsonObject, który dziedziczy DynamicObject, implementuje tylko odczyt/wywołanie metody dynamicznego kontraktu, takie jak TryGetMember, TryGetIndex i TryInvokeMember. ale żaden z elementów takich jak TrySetMember.

Jednakże, jeśli przesyła się do IDynamicJsonObject, zapewnia dostęp do wewnętrznego RavenJObject, który można modyfikować.

Ten przykładowy kod powinien zilustrować jak:

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

bardzo proste rozwiązanie. Próbowałem na wiele sposobów dotrzeć do tego "wewnętrznego" obiektu. Nie wiedziałem, że wystarczy rzucić na IDynamicJsonObject, dzięki. – Quintonn