【问题标题】:nHibernate 'Named Query Not Found' error from unit test builds来自单元测试版本的 nHibernate 'Named Query Not Found' 错误
【发布时间】:2012-11-14 10:05:57
【问题描述】:

我想知道是否有人可以帮助我解决一个令人恼火的问题。

我们在从 nHibernate 调用的 SQL Server 2008 数据库中有一个存储过程。我们有各种单元测试来测试我们的数据访问存储库,当这些测试从我们的本地 Visual Studio 机器上运行时,它们就通过了。但是,当作为我们在 TFS 2010 上针对同一数据库的自动构建的一部分执行时,存储库代码失败并显示:

命名查询未知:GetMyData

映射 XML 看起来像(我已经简化并删除了公司特定的东西):

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="MyCompany.SystemDomain" namespace="MyCompany.SystemDomain">
<class name="MyClass">
    <id name="Guid" type="guid"/>
    <property name="QuoteReference"/>
</class>
<sql-query name="GetMyData">
    <return alias="GetMyData" class="MyClass">
        <return-property column="Guid" name="Guid"/>
        <return-property column="QuoteReference" name="QuoteReference"/>
    </return>       
    exec MyStoredProc :param1, :param2
</sql-query>

调用 C# 代码如下:

IQuery query = session.GetNamedQuery("GetMyData");
query.SetString("QuoteReference", quoteReference);
query.SetInt32("FSANumber", 12345);

IList<MyClass> result = query.List<MyClass>();

我已经检查了 .hbm.xml 文件是一个嵌入式资源,并且我已经使用 Reflector 打开了包含上述代码的存储库程序集(取自我们在 Binaries 文件夹中的构建服务器),并且可以看到包含映射,我可以看到使用 session.GetNamedQuery() 调用调用的命名查询与该程序集中的 sql-query 映射元素中的 name 属性匹配。

当自动构建单元测试执行时,我还在我们的数据库上运行 SQL Profiler,并确认在此期间没有调用存储过程。

任何帮助将不胜感激,因为我们已经完全没有想法了。

非常感谢!

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:

    我猜出于某种原因,在 tfs 机器上运行时不会调用 AddAssembly 方法来添加带有 hbm 文件的 dll。检查运行单元测试时加载了哪些配置文件,并可能尝试创建一个会话工厂,在其中添加没有配置的 dll,看看是否是问题所在。

    【讨论】:

    • 好点。如果在 GAC 中注册了具有相同名称的程序集,则可能找不到本地(= 更新的)副本(这至少适用于 IIS Web 应用程序)。使用任务管理器的资源监视器或进程资源管理器查找正在加载的程序集。
    猜你喜欢
    • 2023-02-24
    • 2014-06-18
    • 2020-07-16
    • 1970-01-01
    • 2019-06-09
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多