2014-06-13 4 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에서 동적 객체에 대한 지원은 주로 읽기 측면에 대한 것으로 보이며 DynamicObject을 상속하는 Raven.Abstractions.Linq.DynamicJsonObject은 읽기/호출 만 구현하기 때문에 기존 객체에 대한 속성을 설정하는 것이 쉽지 않습니다. 동적 계약의 메소드는 TryGetMember, TryGetIndexTryInvokeMember입니다. 하지만 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