NHibernate学习摘记

1. 配置log4net.

  
    
<? xml version="1.0" encoding="utf-8" ?>
< log4net >

< appender name ="rollingFile" type ="log4net.Appender.RollingFileAppender,log4net" >

< param name ="File" value ="D:\log.txt" />
< param name ="AppendToFile" value ="false" />
< param name ="RollingStyle" value ="Date" />
< param name ="DatePattern" value ="yyyy.MM.dd" />
< param name ="StaticLogFileName" value ="true" />

< layout type ="log4net.Layout.PatternLayout,log4net" >
< param name ="ConversionPattern" value ="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" />
</ layout >
</ appender >

< root >
<!-- 如果只需要看看Sql设置INFO就够了,如果你要调试可以设置为DEBUG或ALL -->
< priority value ="INFO" />
< appender-ref ref ="rollingFile" />
</ root >

</ log4net >

a). 将上面的xml保存为log4net.cfg.xml文件,放在工程根目录下并在该文件的属性窗口中选择”始终复制“,这样在每次编译时,此文件都将被复制到工程输出目录中,该输出目录是VS搜索路径的一部分,在代码中可以访问。

b). 在程序初始化的地方使用下面一条语句,用来加载log4net.cfg.xml配置文件。

  
    
XmlConfigurator.Configure( new FileInfo( " log4net.cfg.xml " )); // 初始化log4net

c). 在类中创建一个ILog

  
    
private static readonly ILog log = LogManager.GetLogger( typeof (类名));

d). 使用log

  
    
log.Info( " MyTestInitialize " );
log.Debug(
" MyTestInitialize " );
log.Warn(
" MyTestInitialize " );
log.Error(
" MyTestInitialize " );

最终,如果一切顺利的话,NHiberante和自己的日志都将被输出到D:\log.txt中。

2. 微软自带的测试框架。

在VS2008中,微软的测试框架不会将dll文件外的配置文件复制到Out目录中,并且测试框架的搜索目录被固定为框架的跟目录(一个很长的地址)。讲解这两个问题的办法是:

1. 解决搜索路径问题。

  
    
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext context)
{
AppDomain.CurrentDomain.SetData(
" APPBASE " , System.Environment.CurrentDirectory);
AppDomain.CurrentDomain.ClearPrivatePath();
// AppDomainSetup.PrivateBinPath = "";
}

将上面的代码加入到测试用例中。就可以修改当前目录为Out目录。可以将此代码放到一个基类中,所有的测试类都继承自此类。

2. 解决非dll文件无法复制的问题

解决方案根目录有个LocalTestRun.testrunconfig文件用于记录需要额外复制的文件。在VS中Solution Items文件夹下也存在此文件。双击此文件,在弹出的窗口中,选择部署,添加一些需要额外复制的文件或者目录即可。(注意:有时候,修改此文件后,VS不能立即生效,导致我经常需要重启VS,郁闷。不知道是个什么情况)。

3. NHibernate.Mapping.Attributes

NHiberante.Mapping.Attributes是nhcontrib的一部分。网址: http://sourceforge.net/projects/nhcontrib/

下面是一个简单的Attribute映射的POCO类。

  
    
[Class(Table = " BaseOrder " , NameType = typeof (Order))] //貌似NameType必选
public class Order
{
[Id(0, TypeType
= typeof (Guid))]    //貌似此几项都必选
[Generator(1, Class
= " guid " )]
public virtual Guid Id { get ; set ; }

[Property]
public virtual string Name { get ; set ; }

[Property]
public virtual string Category { get ; set ; }

[Property]
public virtual bool Discontinued { get ; set ; }
}

那么, Attribute如何生效呢 ? 见下面的NHiberanteHelper类。

  
    
class NHibernateHelper
{
private static ISessionFactory _sessionFactory;

public static ISessionFactory SessionFactory{
get {
if (_sessionFactory == null ){
//只有刚才的Attribute定义还不够,必须将这些映射定义加入到configuration中。
        
System.IO.MemoryStream stream
= new System.IO.MemoryStream();
               // Enable validation (可选)
NHibernate.Mapping.Attributes.HbmSerializer.Default.Validate = true ;
// Here, we serialize all decorated classes (but you can also do it class by class)
NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
stream, System.Reflection.Assembly.GetExecutingAssembly());
stream
.Position = 0 ; // Rewind

Configuration cfg
= new Configuration().Configure(); //此处使用了加载了hibernate.cfg.xml以及*.hbm.xml映射文件
// cfg.AddAssembly(typeof(Product).Assembly);
cfg.AddInputStream(stream); // Use the stream here  //此处才加载了Attribute定义的映射。
_sessionFactory = cfg.BuildSessionFactory();
}
return _sessionFactory;
}
}

public static ISession OpenSession(){
return SessionFactory.OpenSession();
}
}

从上面的代码可以看出,Attribute映射和Xml映射可以同时使用。

你可能感兴趣的:(Hibernate)