在NHibernate中使用Guid作为主键需要注意几点:
1. 数据库中Guid类型为uniqueidentifier,同时必须给定默认值。
2. 生成的实体类中类型为System.Guid
3. 生成的Mapping文件中id对应的class为guid<注意大小写>,id对应的class还有几种不同类型,分别代表不一样的意义,自己Google一下。
4. 使用ISession.Save()后同时还要使用ISession.Flush()<否则数据无法保存进数据库>,至于Flush方法作用,自己Google一下。
网站中同时使用NHibernate和Log4net
1. NHibernate3.0以前的版本都是使用Log4net来记录日志,打3.0开始,它便有了自己的日志记录器
2. 如果项目中即使用了NHibernate,也使用了Log4net,这时在Log4net的配置文件中就要为NHibernate设定相应的配置节,我想它们有点像情侣分手后还偶尔寂莫上上床感觉差不多,呵呵,感觉不干不净的。
3. <logger name="NHibernate" additivity="false">
<level value="OFF" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
<logger name="NHibernate.SQL" additivity="false">
<level value="OFF" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
3.1 上面的两个logger的配置不能少,否则当你有写入logger的动作时,NHibernate就会报错了,而且报错级别是整个进程级别的,不重启WEB服务是不会好的
3.2 第一个logger的level级别不能大于WARN,否则会出现与3.1类似的错误
3.3 如果你想关闭NHibernate的日志写入,那就将两个logger的level都设置为OFF吧!
附上完整的Log4net.config文件
<?xml version="1.0"?>
<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--定义日志的输出媒介,下面定义日志以四种方式输出。也可以下面的按照一种类型或其他类型输出。-->
<root>
<level value="ALL" />
<appender-ref ref="LogFileAppender" />
<!--<appender-ref ref="ConsoleAppender" />
<appender-ref ref="EventLogAppender" />
<appender-ref ref="RollingLogFileAppender" />-->
</root>
<logger name="NHibernate" additivity="false">
<level value="OFF" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
<logger name="NHibernate.SQL" additivity="false">
<level value="OFF" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
<file value="e:\log.log" />
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="[Footer]--Test By Lucky.zeng" />
<!--输出格式
每种转换符号都以%开始,后面跟着一个格式符号和换符号。
%-数字 :该项的最小长度,小于最小长度的用空格填充
%m(message) :输出的日志消息
%n(new line) :换行
%d(datetime) :输出当前语句运行的时刻
%r(run time) :输出程序从运行到执行到当前语句时消耗的毫秒数
%t(thread id):当前语句所在的线程ID
%p(priority) : 日志的当前优先级别,即DEBUG、INFO、WARN…等
%c(class) :当前日志对象的名称,
%L(line ) :输出语句所在的行号
%F(file name):输出语句所在的文件名
%logger 日志名称
-->
<conversionPattern value="时间:%date [线程:%thread] %-5level [类:%c][%L行]%n %-5level:%message%newline" />
</layout>
</appender>
<!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<!--conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /-->
<conversionPattern value="时间:%date [线程:%thread] %-5level [类:%c][%L行]%n %-5level:%message%newline" />
</layout>
</appender>
<!--定义输出到windows事件中-->
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>
<!--RollingFileAppender是输出源也是输出到文件中,只是以自增长的方式-->
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="log/system_log_"/>
<!--是否覆盖-->
<param name="AppendToFile" value="true"/>
<!--设置无限备份=-1 ,最大备份数为1000-->
<param name="MaxSizeRollBackups" value="100"/>
<!--每个文件的最大20k-->
<param name="MaximumFileSize" value="1KB"/>
<!--名称是否可以更改 为false为可以更改-->
<param name="StaticLogFileName" value="false"/>
<!--文件名称-->
<param name="DatePattern" value="yyyyMMdd".log""/>
<param name="RollingStyle" value="Date"/>
<layout type="log4net.Layout.PatternLayout">
<!--conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline" /-->
<conversionPattern value="时间:%date [线程:%thread] %-5level [类:%c][%L行]%n %-5level:%message%newline" />
</layout>
</appender>
</log4net>