2014-06-13 64 views
6

我有一些代码看起来是这样的:RavenDB动态对象

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

我想不通的是如何更新dbItem的性能。
有谁知道该怎么办? 我曾尝试直接访问属性名称,像这样: dbItem.PropertyName 我也试图铸造ExpandoObject,IDictionary的多。但似乎没有任何工作。

回答

3

从Raven 2.5开始,对动态对象的支持似乎主要用于事物的读取方面,并且在现有对象上设置属性并不那么容易,因为Raven.Abstractions.Linq.DynamicJsonObject(继承DynamicObject)仅实现读/调用动态合同的方法,如TryGetMemberTryGetIndexTryInvokeMember。但没有像TrySetMember这样的项目。

但是,如果转换为IDynamicJsonObject它提供了访问内部RavenJObject,您可以操控。

此代码示例应该说明如何:

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

非常简单的解决方案。我尝试了很多方法来达到这个“内在”的对象。不知道刚刚铸造IDynamicJsonObject会做的伎俩,谢谢。 – Quintonn