Именованный запрос не известен, ошибка при попытке вызвать сохраненный процесс с помощью Fluent NHibernate - PullRequest
11 голосов
/ 02 апреля 2010

Я работаю над настройкой NHibernate для проекта, и у меня есть несколько запросов, которые из-за их сложности мы оставим как хранимые процедуры. Я хотел бы иметь возможность использовать NHibernate для вызова sprocs, но столкнулся с ошибкой, которую я не могу понять. Так как я использую Fluent NHibernate, я использую смешанный режим отображения, как рекомендовано здесь . Однако, когда я запускаю приложение, я получаю исключение «Именованный запрос не известен: 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 ]

24 голосов
/ 04 апреля 2010

Когда у меня есть для использования хранимых процедур (что происходит только тогда, когда меня заставляют). Я скорее использую следующий метод для их выполнения:

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

Первый параметр .SetInt32 / DateTime - это просто порядковый номер параметра.

18 голосов
/ 31 мая 2010

Я получил то же сообщение об ошибке, и я решил, что для моего свойства файла hbm.xml «Действие сборки» задано значение «Встроенный ресурс», поэтому вы можете попробовать еще раз.

1 голос
/ 27 июня 2012

Я был пойман этой ошибкой несколько раз.

Причиной могут быть две другие проблемы.

Не добавляется отображение 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, чтобы убедиться, что параметры верны.

...