4

我正在使用 NLOG 通过 JsonLayout 进行日志记录,并希望将这些日志存储在 RavenDB 4.0 中。基本上我正在尝试使用 RavenDB .NET 客户端将原始 json 存储到 ravendb 中。

我在 RavenDB 3.5 中有一个可行的解决方案:使用从“RavenJObject”继承的类,但这个功能在 4.0 中被弃用了。

我通过将json反序列化为动态并存储动态对象来使其工作。但这会将文档存储在无意义的“JObjects”集合中。将 json 转换为动态并再次转换回 json 似乎也有开销。

        var obj = JsonConvert.DeserializeObject<dynamic>(jsonString);
        session.Store(obj);

我知道使用 UI(乌鸦工作室)是可能的。但我找不到使用.Net 客户端的方法。

我认为可能使用 http api,用原始 json 做一个帖子。但我还没有找到任何关于此的文档。

谁能帮帮我?任何建议表示赞赏!

4

1 回答 1

5

这里有代码示例,它允许您对泛型类型进行操作并正确分配集合:

[Fact]
public void RawJson()
{
    using (var store = GetDocumentStore())
    {
        using (var session = store.OpenSession())
        {
            var json = "{ 'Name' : 'John', '@metadata' : { '@collection': 'Users' } }";
            var blittableJson = ParseJson(session.Advanced.Context, json);

            var command = new PutDocumentCommand("users/1", null, blittableJson);
            session.Advanced.RequestExecutor.Execute(command, session.Advanced.Context);
        }

        using (var session = store.OpenSession())
        {
            var user = session.Load<User>("users/1");
            Assert.Equal("John", user.Name);
        }
    }
}

public BlittableJsonReaderObject ParseJson(JsonOperationContext context, string json)
{
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    {
        return context.ReadForMemory(stream, "json");
    }
}

public class User
{
    public string Id { get; set; }

    public string Name { get; set; }
}
于 2018-03-22T11:33:43.233 回答