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