0

Я использую NHibernate для доступа к базе данных SQL Server. Я хочу иметь возможность шифровать строку соединения. Чтение StackOverflow и в других местах я нашел инструкции для разделения строки подключения на раздел connectionStrings в файле конфигурации и ссылки на строку подключения по имени в поле connection_string_name nHibernate.Не удалось получить NHibernate для выполнения запроса после разделения строки подключения

Я выполнил все инструкции до сих пор. Если я настроил его только с помощью поля connection_string, мои запросы будут работать успешно. Если я его отделяю, я получаю исключение при попытке выполнить запрос.

Файл .config содержит эти разделы.

<configSections> 
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"> 
    </section> 
</configSections> 

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
     <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> 
     <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
     <property name="connection.connection_string_name">nHibernateConnection</property> 
     <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
    </session-factory> 
</hibernate-configuration> 

<connectionStrings> 
    <add name="nHibernateConnection" connectionString="Data Source=(local);Password=Rapunz3l!;Persist Security Info=True;User ID=sa;Initial Catalog=VHT_Config" /> 
</connectionStrings> 

Код инициализации делает это.

var config = new Configuration(); 
config.Configure(); 
sessionFactory = config.BuildSessionFactory(); 

Затем код запроса делает это:

using (ISession session = sessionFactory.OpenSession()) 
{ 
    return session.CreateQuery("from myTable").List(); 
} 

я получаю следующее исключение.

myTable is not mapped [from WSConfiguration] 
at NHibernate.Hql.Ast.ANTLR.SessionFactoryHelperExtensions.RequireClassPersister(String name) 
at NHibernate.Hql.Ast.ANTLR.Tree.FromElementFactory.AddFromElement() 
at NHibernate.Hql.Ast.ANTLR.Tree.FromClause.AddFromElement(String path, IASTNode alias) 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.CreateFromElement(String path, IASTNode pathNode, IASTNode alias, IASTNode propertyFetch) 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElement() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromElementList() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.fromClause() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.unionedQuery() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.query() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.selectStatement() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlWalker.statement() 
at NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate() 
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(HqlParseEngine parser, String collectionRole) 
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary`2 replacements, Boolean shallow, String collectionRole) 
at NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary`2 replacements, Boolean shallow) 
at NHibernate.Engine.Query.HQLQueryPlan..ctor(String hql, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(String queryString, Boolean shallow, IDictionary`2 enabledFilters) 
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(String query, Boolean shallow) 
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(String queryString) 
at VHT.Data.VHDAO.RetrieveAll(String tableClass) in C:\Projects\VH\Infrastructure\VHT.Data\VHDAO.cs:line 99 
at MyWS.MyTableComponent.GetMyTableDataSet() 
in MyWS\MyDBComponent.cs:line 169 

Любая идея, почему это произойдет только при настройке connection_string_name? Я что-то упускаю?

Спасибо!

+0

Это не имеет никакого отношения к строке подключения. myTable не является сопоставленным классом. Возможно, вам нужен 'session.CreateSqlQuery (« select * from myTable »). List();' который является запросом Sql и без HQL – Firo

+0

Это интересно. Я попробую это. Странно, что это не дало бы ошибки с другой конфигурацией connection_string. – MarkP

+0

К сожалению, все изменилось. Я знаю, что это странно, но строка подключения - это единственное, что я изменил. Зачем это нужно для сопоставления в одном, а не в другом? – MarkP

ответ

0

CreateQuery принимает строку HQL в качестве параметра. При использовании HQL вы запрашиваете объект, а не таблицу. Поэтому

session.CreateQuery("from myTable").List(); 

будет работать, только если имя вашего класса имеет имя MYTABLE Однако, если ваш класс имеет имя MyTable, вы будете в конечном итоге получить ошибку

myTable is not mapped 

Таким образом, попробуйте изменить myTable на MyTable, чтобы соответствовать вашим соглашениям об именах классов.

+0

Я попробую это, но это все еще не похоже, что это будет проблемой, вызванной изменением конфигурации connectionString. – MarkP

Смежные вопросы