命名查询未知错误尝试使用Fluent NHibernate调用存储过程

时间:2010-04-02 19:31:14

标签: nhibernate fluent-nhibernate nhibernate-mapping

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

我的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>

我调用sproc的代码看起来像这样:

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

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

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

3 个答案:

答案 0 :(得分:24)

当我使用来使用存储过程时(仅在我被迫时才会发生)。我更愿意使用以下方法来执行它们:

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

.SetInt32 / DateTime的第一个参数只是参数的序号位置。

答案 1 :(得分:17)

我收到了同样的错误消息,为我解决的是确保我的hbm.xml文件属性“Build action”设置为“Embedded Resource”,所以你可能想再试一次。

答案 2 :(得分: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文件以确保参数正确。