Подтвердить что ты не робот

Именованный запрос неизвестной ошибки, пытающейся вызвать сохраненную процедуру с использованием Fluent NHibernate

Я работаю над настройкой NHibernate для проекта, и у меня есть несколько запросов, которые из-за их сложности мы выйдем в качестве хранимых процедур. Я хотел бы иметь возможность использовать NHibernate для вызова sprocs, но столкнулся с ошибкой, которую я не могу понять. Поскольку я использую Fluent NHibernate, я использую сопоставление смешанного режима, как рекомендовано здесь. Однако, когда я запускаю приложение, я получаю исключение "Named query not known: 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), но я до сих пор не знаю, почему подход, который у меня есть перечисленных выше, не работает. Мне все еще интересно узнать, почему, поскольку это может дать ценную информацию о будущих проблемах.

4b9b3361

Ответ 1

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

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

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

Ответ 2

У меня появилось такое же сообщение об ошибке, и я решил, что для моего свойства hbm.xml файла "Build action" было установлено значение "Embedded Resource", поэтому вы можете попробовать еще раз.

Ответ 3

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

Это могут вызвать две другие проблемы.

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