【问题标题】:RavenDB dynamic objectsRavenDB 动态对象
【发布时间】:2014-06-18 03:56:53
【问题描述】:

我的代码看起来像这样:

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 等。但似乎没有任何效果。

【问题讨论】:

    标签: c# ravendb


    【解决方案1】:

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

    【讨论】:

    • 非常简单的解决方案。我尝试了很多方法来获得这个“内部”对象。不知道只转换为 IDynamicJsonObject 就可以了,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多