为什么在RavenDB中存储Nancy.DynamicDictionary只保存属性名称而不保存属性值?

为什么在RavenDB中存储Nancy.DynamicDictionary只保存属性名称而不保存属性值?,ravendb,dynamic-language-runtime,nancy,Ravendb,Dynamic Language Runtime,Nancy,我正试图保存(RavenDB build 960)表单数据项的名称和值,这些数据项通过其内置的请求传递到Nancy模块中。表单 如果我保存一个动态对象的简单实例(带有测试属性和值),那么一切都会正常工作,属性名称和值都会被保存。但是,如果我使用Nancy的Request.Form,则只保存动态属性名 我知道在检索动态数据(ravenjabjects等)时,我将不得不处理与恢复正确类型有关的进一步问题,但现在,我想首先解决保存动态名称/值的问题 以下是整个测试请求和代码: 小提琴手请求(PUT)

我正试图保存(RavenDB build 960)表单数据项的名称和值,这些数据项通过其内置的
请求传递到Nancy模块中。表单

如果我保存一个
动态
对象的简单实例(带有测试属性和值),那么一切都会正常工作,属性名称和值都会被保存。但是,如果我使用Nancy的
Request.Form
,则只保存动态属性名

我知道在检索动态数据(ravenjabjects等)时,我将不得不处理与恢复正确类型有关的进一步问题,但现在,我想首先解决保存动态名称/值的问题

以下是整个测试请求和代码:

小提琴手请求(PUT)

南希模块

Put["/report/{name}/add"] = parameters =>
    {
        reportService.AddTestDynamic(Db, parameters.name, Request.Form);
        return HttpStatusCode.Created;
    };
public void AddTestDynamic(IDocumentSession db, string name, dynamic data)
{
    var testDynamic = new TestDynamic
    {
            Name = name,
            Data = data
    };
    db.Store(testDynamic);
    db.SaveChanges();
}
服务

Put["/report/{name}/add"] = parameters =>
    {
        reportService.AddTestDynamic(Db, parameters.name, Request.Form);
        return HttpStatusCode.Created;
    };
public void AddTestDynamic(IDocumentSession db, string name, dynamic data)
{
    var testDynamic = new TestDynamic
    {
            Name = name,
            Data = data
    };
    db.Store(testDynamic);
    db.SaveChanges();
}
TestDynamic类

public class TestDynamic
{
    public string Name;
    public dynamic Data;
}
运行时请求表单的动态内容

生成的RavenDB文档

{
  "Name": "test",
  "Data": [
    "username",
    "age"
  ]
}
注意:请求的类型。表单是
Nancy.DynamicDictionary
。我认为这可能是问题所在,因为它继承自
IEnumerable
,而不是预期的
IEnumerable
。我认为RavenDB正在枚举
DynamicDictionary
,只返回动态成员名,而不是成员名/值对

有人能告诉我如何或是否可以将Request.Form作为
动态
对象保存到RavenDB吗?如果可能的话,我希望避免任何手工制作的
DynamicDictionary
枚举来构建
dynamic
实例,以便RavenDB可以正确序列化

多谢各位

编辑1@Ayende

DynamicDictionary似乎实现了
GetDynamicMemberNames()
方法:

查看GitHub上的代码可以发现以下实现:

public override IEnumerable<string> GetDynamicMemberNames()
{
    return dictionary.Keys;
}
您可以看到,生成的文档是一种改进。RavenDB现在正确地获取了
DynamicDictionary
类型信息,虽然动态属性名称已正确序列化,但遗憾的是动态属性值未正确序列化

下图显示了正在使用的新外观
DynamicDictionary
。在我看来一切都很好,新的字典界面清晰可见。我唯一注意到的是,调试器中的动态“结果视图”(与“动态视图”相反)只显示属性名,而不显示属性值。“动态视图”如前所示显示两者(见上图)

运行时动态索引的内容 生物分形, 问题在于DynamicDictionary,在JSON中,类型可以是对象也可以是列表,不能两者都是。
对于动态对象序列化,我们依赖于GetDynamicMemberNames()的实现来获取属性,我假设它不存在。

GetDynamicMemberNames()确实存在。我刚刚将IDictionary添加到DynamicDictionary,它将被推送到master,并成为0.12版本的一部分,today@TheCodeJunkie. 请参见上面的编辑2。对不起,我弄糊涂了。您描述的修复程序是否打算允许RavenDB序列化属性值?或者我应该在序列化之前将表单数据项传输到标准字典中?谢谢。你可以试着从源代码构建(阅读我们如何在repo中构建文件并获取本地NUGET),看看这是否解决了问题。您的问题引发了IDictionary的实现,这是我们以前讨论过但从未讨论过的事情doing@TheCodeJunkie. 太好了。再次感谢您的代码更新。我将尝试使用本地NUGET运行源代码。我发现(见上面的编辑2)创建对最新Nancy源项目的简单引用并不能解决我的问题,即动态值没有序列化到RavenDB,也许我需要您建议的本地NUGET?FWIW,您是否创建了一个单元测试来查看新的DynamicDictionary是否允许动态键/值序列化?