gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:03:22 29 4
gpt4 key购买 nike

我正在尝试保存(RavenDB build 960)通过内置 Request.Form 传递到 Nancy 模块的表单数据项的名称和值。

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

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

这是完整的测试请求和代码:

Fiddler 请求 (PUT) enter image description here

南希模块

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;
}

运行时Request.Form的动态内容 enter image description here

生成的 RavenDB 文档

{
"Name": "test",
"Data": [
"username",
"age"
]
}

注意:Request.Form 的类型为 Nancy.DynamicDictionary 。我认为这可能是问题所在,因为它继承自 IEnumerable<string>而不是预期的IEnumerable<string, object> 。我认为 RavenDB 正在枚举 DynamicDictionary并且只返回动态成员名称而不是成员名称/值对。

谁能告诉我如何或是否可以将 Request.Form 视为 dynamic对象关于将其保存到 RavenDB 的问题?如果可能的话,我想避免任何手工制作的 DynamicDictionary 枚举建立一个dynamic实例以便 RavenDB 可以正确序列化。

谢谢

编辑 1 @Ayende

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

Nancy.DynamicDictionary

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

public override IEnumerable<string> GetDynamicMemberNames()
{
return dictionary.Keys;
}

这是您期望在这里看到的吗?

编辑 2 @TheCodeJunkie

感谢您的代码更新。为了测试这一点,我有:

  1. 创建了 NancyFx/Nancy 主分支的本地克隆GitHub
  2. 将 Nancy.csproj 添加到我的解决方案中并引用该项目
  3. 运行与上面相同的测试

来自新 DynamicDictionary 的 RavenDB 文档

{
"Name": "test",
"Data": {
"$type": "Nancy.DynamicDictionary, Nancy",
"username": {},
"age": {}
}
}

您可以看到生成的文档有所改进。 DynamicDictionary RavenDB 现在可以正确获取类型信息,并且动态属性名称已正确序列化,但不幸的是动态属性值并未正确序列化。

下图显示了新外观 DynamicDictionary在行动中。对我来说一切看起来都很好,新的词典界面清晰可见。我注意到的唯一一件事是调试器中的动态“结果 View ”(与“动态 View ”相对)仅显示属性名称,而不显示它们的值。 “动态 View ”显示两者如前(见上图)。

运行时 DynamicDictionary 的内容 enter image description here

最佳答案

生物分形,问题是 DynamicDictionary,在 JSON 中,类型可以是对象或列表,它们不能同时是两者。对于动态对象序列化,我们依靠 GetDynamicMemberNames() 的实现来获取属性,我认为它不存在。

关于ravendb - 为什么在 RavenDB 中存储 Nancy.DynamicDictionary 只保存属性名称而不保存属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11178704/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com