c# - C# 中的 Mongo DB 实体绑定
问题描述
我在 MongoDB 中有以下文档格式
文件 1:
{
"_id" : ObjectId("5b0d30ae942267c0c8f6229d"),
"Expression" : "[tag] = 'Druck1' && [status]='OK'",
"Name" : "Druck1 is running",
"Actions" : [
{
"TemplateName" : "Warning",
"Tags" : "[tag]",
"Roles" : [
"Group_AdUser",
"Group_FieldServiceCoordinator",
"Group_FieldServiceTechnician",
"Group_Roaster",
"Group_ServiceAdmin",
"Group_ServiceManager",
"Group_ServiceSales",
"Group_TSCUser",
"Group_WorkshopRepairCoordinator"
],
"IsActive" : true,
"SequenceNo" : 0,
"Type" : "EventMessageAction"
}
],
"IsActive" : true,
"TargetUsers" : null,
"TargetGroups" : null,
"Type" : "Rule"
}
文件 2:
{
"_id" : ObjectId("5b0bc01fcd8d2966e0fdf2f2"),
"Expression" : "HasProperty('category') && [category] = 'Temperature'",
"Name" : "RTF Machine Temperature (History Data)",
"Actions" : [
{
"Table" : "[machinename]",
"Key" : "'RTF'",
"Value" : "[value]",
"Timestamp" : "[timestamp]",
"ExpirationDate" : "[timestamp]",
"Icon" : "''",
"Color" : "''",
"Text" : "''",
"Category" : "[category]",
"IsActive" : true,
"Type" : "HistoryDataAction",
"SequenceNo" : 0
}
],
"IsActive" : true,
"TargetUsers" : null,
"TargetGroups" : null,
"Type" : "Rule"
}
有什么办法,我可以通过我的实体获取上述记录,如下所示:
规则实体:
[DataContract]
public abstract class Rule
{
[DataMember]
public string Expression { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public IEnumerable<Action> Actions { get; set; }
[DataMember]
public bool IsActive { get; set; }
}
动作实体:
public class Action
{
}
历史动作实体:
[DataContract]
public class HistoryDataAction : Action
{
public HistoryDataAction()
{
}
[DataMember]
[JsonProperty("table")]
public string TableExpression { get; set; }
[DataMember]
[JsonProperty("key")]
public string KeyExpression { get; set; }
[DataMember]
[JsonProperty("value")]
public string ValueExpression { get; set; }
[DataMember]
[JsonProperty("timestamp")]
public string TimestampExpression { get; set; }
[DataMember]
[JsonProperty("expiration_date")]
public string ExpirationDateExpression { get; set; }
[DataMember]
[JsonProperty("icon")]
public string IconExpression { get; set; }
[DataMember]
[JsonProperty("color")]
public string ColorExpression { get; set; }
[DataMember]
[JsonProperty("text")]
public string TextExpression { get; set; }
[DataMember]
[JsonProperty("category")]
public string CategoryExpression { get; set; }
[DataMember]
[JsonProperty("is_active")]
public bool IsActive { get; set; }
[DataMember]
[JsonProperty("type")]
public virtual string Type
{
get { return this.GetType().Name; }
}
[DataMember]
[JsonProperty("sequence_no")]
public int SequenceNo { get; set; }
}
事件动作数据:
[DataContract]
public class EventMessageAction : Action
{
public EventMessageAction()
{
}
[DataMember]
public string TemplateName { get; set; }
[DataMember]
public string Tags { get; set; }
[DataMember]
public List<string> Roles { get; set; }
[DataMember]
public bool IsActive { get; set; }
[DataMember]
public int SequenceNo { get; set; }
[DataMember]
public virtual string Type { get; set; }
}
是否有类似 TypeNameHandling 的东西,我们可以通过 $type 为 MongoDB 实现。我需要获取文档列表并将其映射到我的实体。如果动作类型是 HistoryDataAction,那么它应该用于 HistoryDataAction 实体,否则用于 EventMessageAction 实体。
正常的 collection.Find() 在这里不起作用。它成功地为我提供了 Rule 实体,但未能绑定 Action 实体。
解决方案
使用 BsonKnownTypes 属性装饰您的基本类型(操作)。例如:
[BsonKnownTypes(typeof(EventMessageAction),
typeof(HistoryDataAction))]
public class Action
{
}
[更新] 您的数据不包含驱动程序所需的类型键来知道将数据映射到什么类型。如果可能,将“Type”键重命名或复制为“_t”
推荐阅读
- javascript - Vue.JS:除非我打开开发工具,否则变量不会更新
- here-api - OAuth1 是大规模矩阵 API 的正确签名过程吗?
- nginx - Nginx 不提供音频文件
- stm32 - STM32 F334R8 I2C GPIO问题 - 不工作
- python - 在 pandas 的列中搜索一个列表,如果找到则返回一个字符串值,如果没有则返回 null
- python - 我对“自我”实例有什么不了解?
- javascript - 如何使用带有对象数组和 prevState 的 React setstate 方法?
- regex - Powershell 正则表达式复杂模式 (XML)
- javascript - JS箭头函数作为对象方法的语法
- php - php openssl_decrypt() 参数(之前由 perl Crypt::CBC 加密)