gpt4 book ai didi

c# - 在 RavenDB 中存储/检索动态数据

转载 作者:太空狗 更新时间:2023-10-29 17:48:29 25 4
gpt4 key购买 nike

我正在使用 RavenDB 并且需要存储动态数据,例如:

public class User {
public string Name;
public dynamic Data;
}

看来我可以使用许多不同的类型,例如 dynamic , RavenJObject , DynamicJsonObject , ExpandoObject , Dictionary<string, object> , 但我不知道有什么区别。

有人可以解释动态数据的选项吗?我不太关心查询,而更关心轻松存储和检索。

最佳答案

问题

事情是这样的,如果你有一个dynamic属性,那么RavenDB会总是将它反序列化为一个RavenJObject。例如:

public class User {
public dynamic Data = new ExpandoObject();
}

...

var user = new User();
user.Data.SomethingNew1 = "foo";

这看起来无害并且在您创建用户时工作正常。但是当你Load 用户时,RavenDB 不知道你想要什么类型的dynamic 所以它使用RavenJObject。您不能使用 RavenJObject 动态创建属性(expando 样式),因此失败:

var user = session.Find<User>(...);
user.Data.SomethingNew2 = "foo"; //compiles, but throws

我的解决方案

使用 ExpandoObject 并在序列化的属性中明确定义其类型。这让 RavenDB(或者我猜是 JSON)知道你期待什么类型并且它不必猜测 RavenJObject。然后,为了保持语法魔力,用动态访问器包装该属性。

public class User {
public ExpandoObject _Data = new ExpandoObject();

public dynamic Data {
get { return _Data; }
}
}

有多种方法可以使 expando 对象成为私有(private)对象并为 Data 创建一个 setter,但您明白了。

更多问题

更新:不幸的是,这个解决方案暴露了更多问题。假设您在动态数据中存储了一个字符串列表:

user.Data.Keys = new List<String>{"a","b","c"};

序列化/反序列化后,JSON/Raven 再次不知道您期望的是什么类型。所以如果你尝试这个(见下文)然后它编译但你得到一个运行时异常不能隐式地将类型'Raven.Abstractions.Linq.DynamicList'转换为'System.Collections.Generic.List':

List<string> keys = user.Data.Keys;

关于c# - 在 RavenDB 中存储/检索动态数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068523/

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