使用 NHibernate 流畅映射将我的自定义日志对象记录到数据库中

Logging my custom log object into database using NHibernate fluent mapping

我在我的项目中使用 log4net 以及 NHibernate。每条记录的信息都存储为 MyLog 对象的一个​​实例,它已经是一个 NHibernate 实体及其映射,table 等。我还需要从数据库加载日志并将其显示到用户,这就是 NHibernate 方法似乎非常方便的原因。

使用 AdoNetAppender 设置登录数据库并不困难,如下所述:

How to use Log4Net utility for logging into database using c#

但是,我想知道为什么我必须在我的配置文件中明确配置所有列-属性 映射:

<commandText value="INSERT INTO log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
                <parameterName value="@log_date"/>
                <dbType value="DateTime"/>
                <layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter>
...

虽然我已经在我流畅的API映射中做到了!

public LogRecordMap () {
            Table("log");
            Id(x => x.ID)
                .Column("id")
                .GeneratedBy.Native();
            Map(x => x.ObjectID)
                .Column("objectid")
                .Not.Nullable()
...

我发现它重复了,因为我必须同时维护流畅的映射和 AdoNetAppender 配置。是否有任何“NHibernateAppender”我可以提供我的映射 class 而不是直接 SQL 命令及其所有参数,因为我必须提供 AdoNetAppender?

我建议将您的日志记录和应用程序分开。日志记录不应以映射的形式依赖于您的应用程序。如果您破坏了应用程序中的某些内容,日志记录应该会继续工作。有两个映射到你 log table 看起来双重。但是它们多久改变一次?如果你只想使用 nhibernate 来访问数据库,你可以编写一个自定义附加程序来这样做。