2012-10-11 1 views
0

я использую для разработки моего приложения Визуальное Estudio 2010 C#, NHibernate queryover, SilverLight 5, в этой части все отлично работает в части доступа к данным я использую это:hhibernate вопрос транзакции, когда я использовал в моно

using (var session = NHibernateFactory.OpenSession()) 
{ 
    ClassAlias ca = null; 
    var x = session.QueryOver<SomeClass>() 
      .Where(root=>root.SomeField > somefield) 
      .SelectList(list=>list 
      .Select(root=>root.SomeField1).WithAlias(()=>ca.SF1) 
      ... 
      .Select(root=>root.SomeFieldN).WithAlias(()=>ca.SF2) 
      ) 
      .UnderlyingCriteria.SetResultTransformer(
         Transformers.AdvanceEntityMapTransformer<ClassAlias>()) 
        .List<ClassAlias>(); 

} 

Все для доступа к данным отборное заявление, так что проблема, когда я действительно опубликовать мое приложение в Linux среду с моно, то я начать эту прерывистую ошибку:

16:51:45.488 [Threadpool worker] ERROR NHibernate.Transaction.AdoTransaction - Begin transaction failed 
System.NotImplementedException: The requested feature is not implemented. 
    at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction transaction) [0x00000] in <filename unknown>:0 
    at MySql.Data.MySqlClient.MySqlConnection.Open() [0x00000] in <filename unknown>:0 
    at NHibernate.Connection.DriverConnectionProvider.GetConnection() [0x00000] in <filename unknown>:0 

это бревно из NHibernate общего файла журнала, думаю, что я не нахожу whow, чтобы исправить это, любой hel р будет действительно Wellcome

я добавить пользовательский журнал для захвата исключение и убедитесь, что это исключение в NHibernate является причиной моего запроса не получится, что это так, и это исключение:

ERROR serverAppLog - custom error message 
NHibernate.Exceptions.GenericADOException: could not execute query 
[ SELECT this_.list_id as y0_, this_.list_name as y1_ FROM vicidial_lists this_ ] 
[SQL: SELECT this_.list_id as y0_, this_.list_name as y1_ FROM vicidial_lists this_] ---> System.NotImplementedException: The requested feature is not implemented. 
    at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction transaction) [0x00000] in <filename unknown>:0 
    at MySql.Data.MySqlClient.MySqlConnection.Open() [0x00000] in <filename unknown>:0 
    at NHibernate.Connection.DriverConnectionProvider.GetConnection() [0x00000] in <filename unknown>:0 
    --- End of inner exception stack trace --- 
    at NHibernate.Loader.Loader.DoList (ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters) [0x00000] in <filename unknown>:0 
    at NHibernate.Loader.Loader.ListIgnoreQueryCache (ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters) [0x00000] in <filename unknown>:$ 
    at NHibernate.Loader.Loader.List (ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters, ISet`1 querySpaces, NHibernate.Type.IType[] resu$ 
    at NHibernate.Loader.Criteria.CriteriaLoader.List (ISessionImplementor session) [0x00000] in <filename unknown>:0 
    at NHibernate.Impl.SessionImpl.List (NHibernate.Impl.CriteriaImpl criteria, IList results) [0x00000] in <filename unknown>:0 
+1

Вы используете System.Transactions/TransactionScope в своем приложении? –

+0

Я не напрямую, но распространение NHibernate, которое я использую, предоставляется моей компанией. –

ответ

1

Если вы используете System.Transactions/TransactionScope (что, по-видимому, из вашей трассировки стека), то я подозреваю, что это связано с тем, что транзакция перерастает в распределенную транзакцию (т. Е. DTC).

Обычно это происходит, если вы пытаетесь получить доступ к двум различным транзакционным ресурсам в пределах одного и того же TransactionScope - например. две разные базы данных (или одна и та же база данных, но строки подключения различаются) или MSMQ и база данных.

Проблема в том, что большинство драйверов MySql не поддерживают DTC - и это вызывает то, что вызывает это исключение. У вас есть несколько вариантов:

  1. Рисунок, почему это эскалация и найти способ избежать этого (лучше всего подходит для выполнения, если это возможно - DTC является относительно медленным)
  2. Закрепить драйвер MySql либо нагнетать или не привлекать (я не уверен, разветвлений последнего)
  3. Я слышал слухи о том, что есть некоторые коммерческие драйверы MySql, которые поддерживают DTC - проверить с помощью Google
  4. Возможно использовать ODBC см Distributed transactions between MySQL and MSSQL (я не пробовал , но это представляется возможным)
  5. Использование Sql Se rver :)
+0

Большое спасибо за ваш ответ, я нахожу его действительно полезным. Я попытаюсь выяснить, где я вызываю контекст DTC, и попытаюсь его избежать. Надеюсь, что в любом случае я дам вам знать –

+0

Я не могу найти ничего, что могло бы вызвать это, по крайней мере, не скомпилированное, может привести к тому, что мое приложение состоит из (класс, который использует NHibernate для извлечения данных из базы данных (mysql) и предоставляет их приложению silverligth через wcf) называется в качестве элемента управления на странице PHP? –

+0

Проверьте для TransactionFlowAttribute и OperationBehavior (TransactionScopeRequired = true) службу WCF –

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