Mongo WriteLog继承问题

时间:2015-04-07 22:06:32

标签: c# asp.net-mvc mongodb inheritance mongodb-.net-driver

我的应用程序中有以下Log类可以登录到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; }        
}

如您所见,Log类是我所有日志记录类型的基类。 WebErrorLog继承了ErrorLog类的属性,并且还扩展为包括RouteParameters和RequestType属性(它们也包含在ActivityLog类中)。在我的应用程序中,我创建了一个新的WebErrorLog并将其保存到MongoDB中。虽然它被保存到正确的数据库(WebErrorLog db),但是忽略了从ErrorLog类继承的属性。我认为可能必须在我的类如何在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; 
    }        
}

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。 事实证明,我没有正确映射BsonClassMapper中的类。所以我删除了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; 
    }        
}

我必须更改类定义以将约束添加为数据注释。我必须在根类中添加一个BsonDiscriminator,并在根类上定义可能的类实现。

    [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; }        
}