我的应用程序中有以下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;
}
}
答案 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; }
}