我想将对象保存到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)的任何其他方式有这样的行为吗? 感谢
UPD:
我想要实现的是像我的文档中的下一个结构(自动序列化类型):
{
"$type" : "MyNamespace.Foo",
"Id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
"Name" : "Vasia"
}
而不是像这样的当前(没有类型):
{
"Id": "1560e1be-bf87-4720-a22e-b7e2c4c37f2e",
"Name" : "Vasia"
}
答案 0 :(得分:3)
使用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();
例如,在通用存储库中使用。
答案 1 :(得分:2)
根据我的理解,您的意思是说您想要识别客户,卖方等实体的类型。
如果是这样,我想通知您,Cosmos DB是架构较少的数据库,因此您不能以Customer等格式使用它。如果您确实需要识别Cosmos DB中的对象类型,则必须在要保存的对象或实体中添加一个属性,如Type =“Customer”或Type =“Employee”,因为DocumentDB中的所有对象都存储在类似的形式,就是JSON,没有像SQL中的客户/员工表这样的概念。
如果对你有帮助,别忘了给我答案。