【问题标题】:nHibernate: Unable to locate persisternHibernate:无法找到持久性
【发布时间】:2010-12-03 10:59:23
【问题描述】:

运行 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 类。但是单元测试和数据访问层都引用了包含 Customer 类的 DataTransfer 程序集。 Customer 类是公共的,所有属性都是公共虚拟的。

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

return session.Get<Customer>(customerId);

【问题讨论】:

    标签: nhibernate


    【解决方案1】:
    1. 确保您的映射文件名为 *.hbm.xml

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

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

    希望这些事情能帮上忙——否则我们可以研究其他一些选项(但 1 和 2 解决了 90% 的持久性问题)

    【讨论】:

    • 仅供参考 - 对于第 2 项,请查看 Studio 中的 XML 文件属性,它是顶部的组合框(我相信默认设置是不复制,但我没有打开 Studio)。
    • 是的,映射文件被命名为 hbn.xml 而不是 hbm.xml 感谢您的帮助。
    • 我还会在您的列表中添加一个 2.5,确保您在创建工厂时加载映射程序集。
    • 在我的情况下,构建操作是“嵌入式资源”,但我仍然遇到同样的错误。这些步骤为我解决了这个问题:1)将构建操作更改为“嵌入式资源”以外的其他内容 2)保存 3)将其更改回“嵌入式资源”4)保存
    【解决方案2】:

    我正在使用 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));
    

    现在它工作得很好..

    【讨论】:

      【解决方案3】:

      在您的 hibernate.cfg.xml 文件中,添加以下代码:

       <mapping assembly="(name of your Assembly Project)" />
      

      基本上,在您的代码中:

       <mapping assembly="DataTransfer" />
      

      【讨论】:

        猜你喜欢
        • 2012-04-23
        • 2022-10-04
        • 2018-02-22
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        相关资源
        最近更新 更多