2010-04-02 52 views
11

我正在一个存储过程对一个项目设置NHibernate和我有,由于其复杂性,我们将离开作为存储过程的几个疑问。我想能够使用NHibernate调用sprocs,但遇到了一个我无法弄清的错误。由于我使用流利NHibernate我使用混合模式映射推荐here。但是,当我运行应用程序时,我得到一个“命名查询未知:AccountsGetSingle”异常,我无法弄清楚原因。我想我的HBM映射可能有问题,因为我不太熟悉它们,但我不确定。命名查询未知错误试图调用使用功能NHibernate

我的NHibernate的配置代码:

private ISessionFactory CreateSessionFactory() 
{ 
    return Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2005 
      .ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB"))) 
       .ShowSql()) 
     .Mappings(m => 
      { 
       m.HbmMappings.AddFromAssemblyOf<Account>(); 
       m.FluentMappings.AddFromAssemblyOf<Account>(); 
      }) 
     .BuildSessionFactory(); 
} 

我的hbm.xml文件是:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <sql-query name="AccountsGetSingle"> 
     <return alias="Account" class="Core, Account"></return> 
     exec AccountsGetSingle 
    </sql-query> 
</hibernate-mapping> 

我所在的地方调用存储过程的代码如下所示:

public Account Get() 
{ 
    return _conversation.Session 
     .GetNamedQuery("AccountsGetSingle") 
     .UniqueResult<Account>(); 
} 

任何想法或想法,将不胜感激。谢谢。

更新: @ kibbled_bits的建议,让我说,我在寻找(下能够调用从NHibernate的存储过程)的最终结果,但我仍然不知道为什么我没有按上面所列的方法”工作。我仍然很好奇,因为它可能为未来的问题提供有价值的见解。

回答

24

当我使用存储过程(这只有当我被迫发生)。我更愿意用下面的方法来执行它们:

var list = Session.CreateSQLQuery("exec GetCustomerByNaturalKey ?, ?") 
.AddEntity(typeof(Customer)) 
.SetInt32(0, customerNo) 
.SetDateTime(1, createdDate) 
.List<Customer>(); 

到.SetInt32 /日期的第一个参数就是参数的顺序位置。

+0

我不认为我知道你可以使用.CreateSQLQuery()调用存储过程,尽管它非常有意义。当我在早上上班时,我会给它一个镜头。 – Hamman359 2010-04-04 18:28:23

+1

这工作完美。我能够成功地调用我的存储过程而没有任何问题。谢谢。 – Hamman359 2010-04-06 14:26:49

+2

+1真棒酱。其他答案涉及映射hbm片段。这好多了。 – 2012-08-22 15:40:57

17

我得到了相同的错误消息,什么解决了这个问题对我来说是要确保我的hbm.xml文件属性“生成操作”设置为“嵌入的资源”,所以你可能想给它的另一个尝试。

+0

我尽可能地避免了过程,所以需要做到这一点很少,我一直忘记这样做。 – MrBoJangles 2015-05-27 20:28:42

1

我已经被这个错误抓出了许多倍。

另外两个问题可能导致此问题。

不添加HBM映射。

用流利的我有以下。

var config = Fluently.Configure() 
       .Database(sqlConfig) 
       .Mappings(c => c.AutoMappings.Add(AutoMap.AssemblyOf<AdvertView>(new QueryAutomappingConfiguration()).UseOverridesFromAssemblyOf<AdvertViewMappingOverride>())) 
       .Mappings(c => c.HbmMappings.AddClasses(typeof(AdvertView), typeof(RelatedAdvertView), typeof(CompanyAtoZListingView))); 

在那里我错过了视图类(它与映射信息与hbm文件配对)。我收到错误。

当我添加新视图'typeof(CompanyAtoZListingView)'它工作正常。

.Mappings(c => c.HbmMappings.AddClasses(typeof(AdvertView), typeof(RelatedAdvertView), typeof(CompanyAtoZListingView))); 

此外,请检查hbm文件以确保参数是正确的。

相关问题