我们把配置文件,Model和Mapping做了简单的介绍。使我们可以轻松的通过配置文件的方式来进行NH的配置。
我们通过对NHibernateBase的了解一下NH的运行机制。
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Threading.Tasks;
6: using NHibernate;
7: using NHibernate.Cfg;
8:
9: namespace NHModel
10: {
11: public class NHibernateBase
12: {
13: private static Configuration Configuration { get; set; }
14: protected static ISessionFactory SessionFactory { get; set; }
15: private static ISession session = null;
16: private static IStatelessSession statelessSession = null;
17: public static Configuration ConfigureNHibernate(string assembly)
18: {
19: Configuration = new Configuration();
20: Configuration.AddAssembly(assembly);
21: return Configuration;
22: }
23: public void Initialize(string assembly)
24: {
25: Configuration = ConfigureNHibernate(assembly);
26: SessionFactory = Configuration.BuildSessionFactory();
27: }
28: public static ISession Session
29: {
30: get
31: {
32: if (session == null)
33: {
34: session = SessionFactory.OpenSession();
35: }
36: return session;
37: }
38: }
39: public static IStatelessSession StatelessSession
40: {
41: get
42: {
43: if (statelessSession == null)
44: {
45: statelessSession = SessionFactory.OpenStatelessSession();
46: }
47: return statelessSession;
48: }
49: }
50: }
51: }
里面有几个概念,我们要说一下
首先NHibernateBase类里,我们发现有4个私有的静态属性。这个属性就是我们要讲解的重点
位于 NHibernate.Cfg.Configuration命名空间下,它的作用是把所有的配置文件和模型进行初始化,但是他需要知道配置文件所在的程序集。
1: Configuration = new Configuration();
2: Configuration.AddAssembly(assembly);
这个assembly必须是mapping所在的程序集名。
加载程序集完成后,我们需要对所有的配置文件和Model进行编译,也就是注册到内存中,达到持久化的效果。
位于NHibernate.ISessionFactory命名空间下,简单的理解就是一个Session工厂几乎可以处理一个数据库的所有操作
1: SessionFactory = Configuration.BuildSessionFactory();
通过这句代码,我们可以得到一个Session工厂。
位于NHibernate.ISession命名空间下,称之为会话,看似和asp.net里的Session长的很像,其实,这里一个Session代表一次数据库操作。
1: session = SessionFactory.OpenSession();
我们可以通过Session工厂的OpenSession方法来得到一个Session(注:可以查看有关联的实体数据,只要session没有释放)。
位于NHibernate.IStatelessSession命名空间下无状态会话,这个和ISession的差异就在,它本身会在执行完数据操作后马上关闭。不会有延迟加载数据的效果。
1: statelessSession = SessionFactory.OpenStatelessSession();
有了这2个Session我们就可以做CRUD操作了。