MongoDB与C#实体绑定:Action子类自动映射方案问询
MongoDB C#驱动中的子类自动映射方案
当然有!MongoDB的.NET驱动提供了类似Json.NET TypeNameHandling的多态映射机制,刚好能解决你遇到的Action子类无法自动绑定的问题。下面我给你详细讲讲两种常用的配置方式:
方式一:通过属性标记配置
这种方式最直观,直接在你的类上添加MongoDB的序列化属性:
// 抽象基类Action的配置 [BsonDiscriminator(RootClass = true, Discriminator = "Type")] [BsonKnownTypes(typeof(EventMessageAction), typeof(HistoryDataAction))] public abstract class Action { // 对应文档中的Type字段,用来区分子类 public string Type { get; set; } // 其他基类属性... } // EventMessageAction子类 public class EventMessageAction : Action { // 子类专属属性 public string EventContent { get; set; } } // HistoryDataAction子类 public class HistoryDataAction : Action { // 子类专属属性 public DateTime QueryTime { get; set; } }
这里[BsonDiscriminator]指定了用文档中的Type字段作为鉴别器,[BsonKnownTypes]则告诉驱动需要识别哪些子类。当你查询Rule实体时,驱动会自动根据每个Action对象的Type字段值,实例化对应的子类。
方式二:通过代码注册类映射
如果不想在类上添加属性耦合,也可以用代码方式注册类映射,通常在程序启动时执行:
// 注册基类Action的映射 BsonClassMap.RegisterClassMap<Action>(cm => { cm.AutoMap(); // 开启鉴别器必填,确保文档中有Type字段 cm.SetDiscriminatorIsRequired(true); // 指定鉴别器字段为文档中的"Type" cm.SetDiscriminator("Type"); // 添加需要识别的子类 cm.AddKnownType(typeof(EventMessageAction)); cm.AddKnownType(typeof(HistoryDataAction)); }); // 注册EventMessageAction子类映射 BsonClassMap.RegisterClassMap<EventMessageAction>(cm => { cm.AutoMap(); // 指定该子类对应的鉴别器值(要和文档中的Type字段值一致) cm.SetDiscriminator("EventMessageAction"); }); // 注册HistoryDataAction子类映射 BsonClassMap.RegisterClassMap<HistoryDataAction>(cm => { cm.AutoMap(); cm.SetDiscriminator("HistoryDataAction"); });
注意事项
- 确保MongoDB文档中每个Action对象都包含
Type字段,且字段值和你配置的鉴别器值完全一致(比如"EventMessageAction"); - 如果你的Rule类中包含
List<Action>类型的Actions属性,驱动会自动遍历数组中的每个元素,根据Type字段映射到对应的子类; - 两种配置方式选一种即可,不要混合使用,避免冲突。
这样配置完成后,你再调用collection.Find()获取Rule实体时,Actions数组里的元素就会正确绑定到对应的EventMessageAction和HistoryDataAction子类了。
内容的提问来源于stack exchange,提问作者Farhan Mukadam
相关产品推荐
相关产品推荐

