2014-06-13 16 views
6

Ich habe Code, der etwa wie folgt aussieht:RavenDB dynamische Objekte

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

Was ich nicht herausfinden kann, ist, wie Eigenschaften des dbItem zu aktualisieren.
Weiß jemand, was zu tun ist? Ich habe versucht, auf den Namen der Eigenschaft direkt wie folgt zuzugreifen: dbItem.PropertyName Ich habe auch versucht, zu ExpandoObject, IDictionary und mehr Casting. Aber nichts scheint zu funktionieren.

Antwort

3

Ab Raven 2.5 scheint die Unterstützung für dynamische Objekte hauptsächlich für die Leseseite der Dinge zu sein, und es ist nicht so einfach, Eigenschaften für ein vorhandenes Objekt festzulegen, da Raven.Abstractions.Linq.DynamicJsonObject, das DynamicObject erbt, nur das Lese-/Aufrufelement implementiert Methoden des dynamischen Vertrags, wie TryGetMember, TryGetIndex und TryInvokeMember. aber keiner der Artikel wie TrySetMember.

Wenn Sie jedoch zu IDynamicJsonObject umwandeln, bietet es Zugriff auf die innere RavenJObject, die Sie bearbeiten können.

Dieses Codebeispiel soll zeigen, wie:

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

Sehr einfache Lösung. Ich habe viele Wege ausprobiert, um zu diesem "inneren" Objekt zu gelangen. Wusste nicht, nur zu IDynamicJsonObject zu werfen, würde den Trick tun, danke. – Quintonn