RavenDB动态对象

Qui*_*onn 6 c# ravendb

我的代码看起来像这样:

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

我无法弄清楚的是如何更新dbItem的属性.
有谁知道该怎么办?我试过直接访问属性名称,如下所示:dbItem.PropertyName我也试过转换为ExpandoObject,IDictionary等.但似乎没有任何效果.

Dav*_*ike 4

从Raven 2.5开始,对动态对象的支持似乎主要是针对事物的读取方面,并且在现有对象上设置属性并不那么容易,因为Raven.Abstractions.Linq.DynamicJsonObject继承的DynamicObject,仅实现动态合约的读取/调用方法,像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?"
}
Run Code Online (Sandbox Code Playgroud)