Mongo WriteLog继承问题

Mongo WriteLog inheritance issue

我的应用程序中有以下日志 classes 可以登录到 MongoDB:

public abstract class Log
{
    public Guid Id { get; set; }
    public DateTime DateCreated { get; set; }
}

public class ActivityLog : Log
{
    public string RouteParameters { get; set; }
    public string RequestType { get; set; }        
}

public class ErrorLog : Log
{
    public string StackTrace { get; set; }
}

public class WebErrorLog : ErrorLog
{
    public string RouteParameters { get; set; }
    public string RequestType { get; set; }        
}

如您所见,日志 class 是我所有日志记录类型的基础 class。 WebErrorLog 继承了 ErrorLog class 的属性,还扩展到包含 RouteParameters 和 RequestType 属性(它们也包含在 ActivityLog class 中)。在我的应用程序中,我创建了一个新的 WebErrorLog 并将其保存到 MongoDB 中。虽然它被保存到正确的数据库 (WebErrorLog db),但是从 ErrorLog class 继承的属性被忽略了。我认为这可能与我的 classes 在 BsonClassMapper 中的注册方式有关,如下所示:

    public static void RegisterLogClasses()
    {           
        if (!BsonClassMap.IsClassMapRegistered(typeof(Log)))
        {
            BsonClassMap.RegisterClassMap<Log>(
            cm =>
            {
                cm.AutoMap();
                cm.MapIdProperty(c => c.Id);
                cm.GetMemberMap(c => c.Id).SetRepresentation(BsonType.String);
                cm.SetIgnoreExtraElements(true);
            });                    
        }

        if (!BsonClassMap.IsClassMapRegistered(typeof(ErrorLog)))
        {
            BsonClassMap.RegisterClassMap<ErrorLog>(
                cm =>
                {
                    cm.SetIgnoreExtraElements(true);
                });
        }

         if (!BsonClassMap.IsClassMapRegistered(typeof(WebErrorLog)))
        {
            BsonClassMap.RegisterClassMap<WebErrorLog>();
        }

        if (!BsonClassMap.IsClassMapRegistered(typeof(ActivityLog)))
        {
            BsonClassMap.RegisterClassMap<ActivityLog>();
        }

        if (!BsonClassMap.IsClassMapRegistered(typeof(DebugLog)))
        {
            BsonClassMap.RegisterClassMap<DebugLog>();
        }

        BsonSerializer.UseNullIdChecker = true; 
    }        
}

我已经解决了这个问题。 事实证明我没有正确映射 BsonClassMapper 中的 classes。所以我删除了 RegisterLogClasses 方法中的代码并替换为以下内容:

public static void RegisterLogClasses()
    {           
        if (!BsonClassMap.IsClassMapRegistered(typeof(Log)))
        {
            BsonClassMap.RegisterClassMap<Log>();                    
        }

        if (!BsonClassMap.IsClassMapRegistered(typeof(ErrorLog)))
        {
            BsonClassMap.RegisterClassMap<ErrorLog>();
        }

         if (!BsonClassMap.IsClassMapRegistered(typeof(WebErrorLog)))
        {
            BsonClassMap.RegisterClassMap<WebErrorLog>();
        }

        if (!BsonClassMap.IsClassMapRegistered(typeof(ActivityLog)))
        {
            BsonClassMap.RegisterClassMap<ActivityLog>();
        }
        BsonSerializer.UseNullIdChecker = true; 
    }        
}

而且我不得不更改 class 定义以将约束添加为数据注释。我必须向根 class 添加 BsonDiscriminator 并在根 classes.

上定义可能的 class 实现
    [BsonIgnoreExtraElements]
    [BsonDiscriminator(RootClass = true)]
    [BsonKnownTypes(typeof(ActivityLog), typeof(ErrorLog))]
public abstract class Log
{
    [BsonId]
    public Guid Id { get; set; }
    public DateTime DateCreated { get; set; }
}
[BsonIgnoreExtraElements]
public class ActivityLog : Log
{
    public string RouteParameters { get; set; }
    public string RequestType { get; set; }        
}
    [BsonIgnoreExtraElements]
    [BsonKnownTypes(typeof(WebErrorLog))]
public class ErrorLog : Log
{
    public string StackTrace { get; set; }
}
    [BsonIgnoreExtraElements]
    [BsonDiscriminator("WebErrorLog")]
public class WebErrorLog : ErrorLog
{
    public string RouteParameters { get; set; }
    public string RequestType { get; set; }        
}