gpt4 book ai didi

azure - 宇宙数据库 : save object type as a property in document

转载 作者:行者123 更新时间:2023-12-02 16:58:42 26 4
gpt4 key购买 nike

当将我的对象更新到 cosmos db 时,我想将对象类型保存为 json 对象的一部分。我尝试在实例化 Cosmos Client 实例时传递 json 序列化器,但它不起作用。我仍然没有在文档中看到对象的类型。我试图做的事情:

    public static readonly JsonSerializerSettings DefaultJsonSerializerSettings =
new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
DateFormatString = "o",
DateFormatHandling = DateFormatHandling.IsoDateFormat,
};

var CosmosClient =
new DocumentClient(
new Uri(CosmosConfig.ServiceEndpoint),
CosmosConfig.AuthNKey,
DefaultJsonSerializerSettings,
connectionPolicySettings);

有没有其他方法可以在不首先进行预处理(将对象转换为 jObject)的情况下实现这种行为?谢谢

更新:

我试图实现的目标类似于文档中的下一个结构(自动序列化类型):

    {
"$type" : "MyNamespace.Foo",
"Id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
"Name" : "Vasia"
}

而不是像这样的当前的(没有类型):

    {
"Id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
"Name" : "Vasia"
}

最佳答案

使用 Cosmos DB 时,我经常让我的文档/类继承与此类似的抽象基类:

public abstract class DocModel
{
[JsonProperty(PropertyName = "$type")]
public virtual string Doctype => GetType().Name;

[JsonProperty(PropertyName = "id")]
public string Id { get; set; }
}

这几乎可以满足您的需求:

public class Cloud : DocModel
{
public string Name { get; set; }
}

public class Foo : DocModel
{
public string Name { get; set; }
}

最终会变成

{
"$type":"Cloud",
"id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
"name" : "Vasia"
}

{
"$type":"Foo",
"id": "2560e1be-bf87-4720-a22e-b7e2c4c37f2e",
"name" : "Vasia2"
}

您可以将 Doctype 属性更改为 GetType().FullName 等以获取命名空间等。

这还允许您根据 Doctype 查询所有文档,例如:

   var t = typeof(T).Name;
IDocumentQuery<T> query = _db.Client
.CreateDocumentQuery<T>(_db.CollectionUri, new FeedOptions { MaxItemCount = -1 })
.Where(predicate)
.Where(_ => _.Doctype == t)
.AsDocumentQuery();

例如在通用存储库中使用。

关于azure - 宇宙数据库 : save object type as a property in document,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47689783/

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