我的一个wpf项目里使用了nhibernate,实体启用了延时加载,DAL里使用的单例模式,基本上以这篇文章为例:
在测试的时候发现了,在多线程时会有问题,后来发现有人提出在BLL里使用session.merge()方法来解决,如:
session.Save(session.Merge(entity));
但是这样后又出现了有些ComboBox绑定不显示的问题,在debug时发现实体的值能读取出来,ComboBox的ItemSource也正常,下拉列表也有值,但就是不显示。若不使用session.merge()则正常。
经过网上搜索,现在我想使用spring.net来管理session,发现有两种使用方法。
一种是使用spring.net的HibernateTemplate,像这样:
publicclassUserDao : HibernateDaoSupport
{publicUserDao()
{
}publicboolSaveObject(User user)
{
HibernateTemplate.Save(user);returntrue;
}publicboolDeleteObject(User user)
{
HibernateTemplate.Delete(user);returntrue;
}publicboolUpdateObject(User user)
{
HibernateTemplate.Update(user);returntrue;
}publicIList GetAllObjectsList()
{returnHibernateTemplate.LoadAll(typeof(User));
}publicUser Load(Object ID)
{return(User)HibernateTemplate.Load(typeof(User),ID);
}
}
另一种是spring.net下载包的Spring.Data.NHibernate.Northwind例子,就像下面这样:
publicabstractclassHibernateDao
{privateISessionFactory sessionFactory;publicISessionFactory SessionFactory
{protectedget{returnsessionFactory; }set{ sessionFactory=value; }
}protectedISession CurrentSession
{get{returnsessionFactory.GetCurrentSession(); }
}protectedIListGetAll()whereT :class{
ICriteria criteria=CurrentSession.CreateCriteria();returncriteria.List();
}
}publicinterfaceIDao{
TEntity Get(TId id);
IListGetAll();
}publicinterfaceISupportsDeleteDao{voidDelete(TEntity entity);
}publicinterfaceISupportsSave{
TId Save(TEntity entity);voidUpdate(TEntity entity);
}
我更倾向于使用第一种方式,这可以让我少改些代码。但我不知道上面两种方式是否可以解决多线程的问题,为了少走弯路,特意在此发帖求助,希望有经验的朋友指点。谢谢!