Именованный запрос неизвестной ошибки, пытающейся вызвать сохраненную процедуру с использованием 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), но я до сих пор не знаю, почему подход, который у меня есть перечисленных выше, не работает. Мне все еще интересно узнать, почему, поскольку это может дать ценную информацию о будущих проблемах.
Ответы
Ответ 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, чтобы убедиться, что параметры верны.