首页 > 解决方案 > 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 实体。

标签: c#.netmongodb

解决方案


使用 BsonKnownTypes 属性装饰您的基本类型(操作)。例如:

[BsonKnownTypes(typeof(EventMessageAction),
    typeof(HistoryDataAction))]
public class Action
{
}

[更新] 您的数据不包含驱动程序所需的类型键来知道将数据映射到什么类型。如果可能,将“Type”键重命名或复制为“_t”


推荐阅读