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