nHibernate:无法找到持久性

时间:2010-12-03 10:59:23

标签: nhibernate

运行VS2003,nHB 3.0.0.3001,尝试通过Gallio 3.2运行单元测试。代码来自“nHibernate夏天”的第一个会话。尝试运行测试时出现以下错误。

NHibernate.HibernateException: Unable to locate persister: DataTransfer.Customer
TargetSite: Void OnLoad(NHibernate.Event.LoadEvent, NHibernate.Event.LoadType)
HelpLink: null
at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType)
at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType)
at NHibernate.Impl.SessionImpl.Get(String entityName, Object id)
at NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id)
at NHibernate.Impl.SessionImpl.Get[T](Object id)
at DataAccessLayer.NhibernateDataProvider.GetCustomerById(Int32 customerId) 

我没有受过教育的猜测是,无法看到客户类。但是单元测试和数据访问层都引用了包含Customer类的DataTransfer程序集。 Customer类是公共的,所有属性都是公共虚拟的。

nHB配置文件位于目录中,Customer映射文件是嵌入式资源。似乎失败了 行:

return session.Get<Customer>(customerId);

2 个答案:

答案 0 :(得分:26)

  1. 确保您的映射文件名为* .hbm.xml

  2. 确保将其设置为嵌入资源。

  3. 如果这些失败,调试并失败,请捕获异常并查看InnerException - NHibernate隐藏了很棒的错误消息。

  4. 希望那些帮助 - 否则我们可以考虑一些其他选项(但1和2解决了90%的持久性问题)

答案 1 :(得分:0)

我正在使用ActiveRecord进行实体映射,在尝试使用ISession.Get时遇到了同样的错误, 而不是使用配置来检索会话,如下所示:

                     ISession session = new NHibernate.Cfg.Configuration()
                    .Configure()
                    .AddAssembly(typeof(Account).Assembly)
                    .SetInterceptor(new SqlStatementInterceptor())
                    .BuildSessionFactory().OpenSession();

我通过ActiveRecordMediator改变它:

                    ISession session = Castle.ActiveRecord.ActiveRecordMediator
                    .GetSessionFactoryHolder().
                    CreateSession(typeof(Castle.ActiveRecord.ActiveRecordBase));

现在它工作得很好..