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映射可以同时使用。

posted on 2011-03-23 21:00  joolu  阅读(689)  评论(0编辑  收藏  举报