
本文共 9562 字,大约阅读时间需要 31 分钟。
我们现在使用NHibernate一步一步来构建数据库访问层.
一.首先建立Blog.Model:实体层项目
(1)先建立EntityBase实体基类,然后所有的实体都继承该类;
namespace Blog.Model{ public class EntityBase { public virtual int Id { get; set; } public virtual bool IsDelete { get; set; } public virtual DateTime CreateDate { get; set; } public virtual int Version { get; set; } }}
Id:使用int值作为id;
IsDelete:是否删除;
CreateDate:创建时间;
Version:NHibernate中作并发控制;
(2)建立实体User
namespace Blog.Model.Entities{ public class User:EntityBase { public virtual int Id{ get;set; } public virtual string UserName{ get;set; } public virtual string Password{ get;set; } public virtual string NickName{ get;set; } public virtual bool Gender{ get;set; } public virtual DateTime Birthday{ get;set; } public virtual string Email{ get;set; } public virtual string Address{ get;set; } public virtual string Phone{ get;set; } public virtual string QQ{ get;set; } public virtual bool IsActive{ get;set; } }}
注意:属性都加上virtual关键字
(3)建立实体xml映射文件
注意:hbmXML映射文件,属性必须设置为"嵌入的资源";XML中的Version字段必须在Id字段之后
NHibernate.Driver.SqlClientDriver Data Source=.\SQLEXPRESS;Initial Catalog=BlogDB;Integrated Security=True;Pooling=False 10 true NHibernate.Dialect.MsSql2008Dialect 10 true 1, false 0, yes 'Y', no 'N'
三.建立Blog.Repository:数据访问层
(1)新建接口IRepository
namespace Blog.Repository{ public interface IRepositorywhere T : EntityBase { T Load(TId id); T Get(TId id); IList GetAll(); IList FindForPage(int index, int count); IList Find(Expression > query); T FindForSingle(Expression > query); IList HQLQuery(string query); TId Save(T entity); void SaveOrUpdate(T entity); void Update(T entity); void Delete(T t); void PhysicsDelete(TId id); }}
(2)新建Repository基类
namespace Blog.Repository{ public abstract class Repositorywhere T : EntityBase { private IUnitOfWork _uow; public Repository(IUnitOfWork uow) { _uow = uow; } protected virtual ISession Session { get { return NHSessionFactory.CreateSession(); } } /// /// 根据Id延迟加载获取实体 /// /// ///public virtual T Load(TId id) { return Session.Load (id); } /// /// 根据Id获取实体 /// /// ///public virtual T Get(TId id) { return Session.Get (id); } /// /// 获取所有实体 /// ///public virtual IList GetAll() { return Session.CreateCriteria(typeof(T)).List ();//使用Criteria //return Session.Query ().ToList(); //return Session.QueryOver ().List();//使用QueryOver linq } /// /// 获取分页数据 /// /// index=(pageNum-1)*pageCount /// 每页的条数pageCount ///public IList FindForPage(int index, int count) { return Session.CreateCriteria(typeof(T)).SetMaxResults(count).SetFirstResult(index).List (); } /// /// lambda表达式获取 /// /// ///public IList Find(Expression > query) { return Session.QueryOver ().Where(query).List(); } /// /// lambda表达式获取单个实体 /// /// ///public T FindForSingle(Expression > query) { return Session.Query ().SingleOrDefault(query); } /// /// HQL查询 /// /// ///public IList HQLQuery(string query) { return Session.CreateQuery(query).List (); } /// /// 保存 /// /// ///public virtual TId Save(T entity) { return (TId)Session.Save(entity); } /// /// 保存或更新 /// /// public virtual void SaveOrUpdate(T entity) { Session.SaveOrUpdate(entity); } ////// 更新 /// /// public virtual void Update(T entity) { Session.Update(entity); } ////// 删除 /// /// public virtual void PhysicsDelete(TId id) { var entity = Get(id); Session.Delete(entity); } public void Delete(T t) { t.IsDelete = true; Update(t); } }}
(3)建立对应的实体的数据访问接口IUserRepository,该接口实现了IRepository
namespace Blog.Repository{ public interface IUserRepository:IRepository{ }}
(4)建立实体的数据访问实现体
namespace Blog.Repository{ public class UserRepository:Repository,IUserRepository { public UserRepository(IUnitOfWork uow) : base(uow) {} }}
(5)Unit of Work模式,从上面的Repository基类可以看到,我们已经注入了该模式的实现;
1.建立IUnitOfWork接口
namespace Blog.Repository{ public interface IUnitOfWork { void Commit(); }}
2.建立NHUnitOfWork类,实现IUnitOfWork接口
namespace Blog.Repository{ public class NHUnitOfWork : IUnitOfWork { public ISession session { get { return NHSessionFactory.CreateSession(); } } public void Commit() { using (ITransaction transaction = session.BeginTransaction()) { try { session.Flush(); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw; } } } }}
(6)NHibernate的Session管理与初始化
为了合理控制Session的生命周期,在.netMVC中我们把Session的生命周期绑定在一次Action里;
1.建立接口ISessionStorage;
namespace Blog.Repository.SessionStorage{ public interface ISessionStorage { ISession Get(); void Set(ISession value); }}
2.新建一个类HttpSessionStorage实现接口ISessionStorage;
public class HttpSessionStorage:ISessionStorage { private string sessionKey = "NhbSession"; public NHibernate.ISession Get() { ISession session = null; if (HttpContext.Current.Items.Contains(sessionKey)) session = (ISession)HttpContext.Current.Items[sessionKey]; return session; } public void Set(ISession value) { if (value != null) { if (HttpContext.Current != null) { HttpContext.Current.Items.Add(sessionKey, value); } } } }
3.新建一个工厂类,获取NHibernate的session
namespace Blog.Repository.SessionStorage{ public static class NHSessionFactory { private static object locker = new object(); private static Configuration _configuration = null; private static ISessionFactory _sessionFactory = null; private static ISessionStorage SessionStorage{get;set;} public static void InitSessionFactory(ISessionStorage sessionStorage) { SessionStorage = sessionStorage;//使用ioc容器注入 } private static void CreateConfiguration() { _configuration = new Configuration().Configure(); } public static Configuration Configuration { get { lock (locker) { if (_configuration == null) { CreateConfiguration(); } return _configuration; } } set { _configuration = value; } } internal static ISessionFactory SessionFactory { get { if (_sessionFactory == null) { if (Configuration == null) { CreateConfiguration(); } lock (locker) { _sessionFactory = Configuration.BuildSessionFactory(); } } return _sessionFactory; } } public static ISession CreateSession() { ISession s = SessionStorage.Get(); if (s == null) { s = SessionFactory.OpenSession(); SessionStorage.Set(s); } return s; } }}
注意要在 void Application_Start()进行初始化
如下代码
NHSessionFactory.InitSessionFactory(container.Resolve());//NHibernate session
这样我们的数据库访问层基本完成了!!
发表评论
最新留言
关于作者
