0

私は自分のアプリケーションの開発に Visual Estudio 2010 c#、nhibernate queryover、silverlight 5 を使用しています。この部分では、これを使用するデータ アクセス部分ですべて正常に動作します。

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>();

}

すべてのデータ アクセスは select ステートメントであるため、アプリケーションを mono を使用して 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 の一般的なログ ファイルからのものです。修正する人が見つからないと思います。どんな助けも本当に歓迎されます。

例外をキャプチャするためのカスタム ログを追加し、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
4

1 に答える 1

1

System.Transactions / TransactionScope を使用している場合 (スタック トレースからはそう思われます)、これは、トランザクションが分散トランザクション (つまり、DTC) にエスカレートされているためだと思われます。

通常、これは、同じ TransactionScope 内の 2 つの異なるトランザクション リソースにアクセスしようとした場合に発生します。2 つの異なるデータベース (または同じデータベースだが接続文字列が異なる)、または MSMQ とデータベース。

問題は、ほとんどの MySql ドライバーが DTC をサポートしていないことです。これが、この例外がスローされる原因です。いくつかのオプションがあります:

  1. なぜエスカレートしているのかを突き止め、これを回避する方法を見つけてください (可能な場合はパフォーマンスに最適です - DTC は比較的遅いです)。
  2. MySql ドライバーを修正して、エスカレートするか、登録しないようにします (後者の影響についてはわかりません)。
  3. DTC をサポートする商用の MySql ドライバーがいくつかあるという噂を聞いたことがあります。Google で確認してください。
  4. ODBC を使用する可能性があります。MySQL と MSSQL 間の分散トランザクションを参照してください(これは試していませんが、可能のようです)。
  5. Sqlサーバーを使用してください:)
于 2012-10-12T13:44:20.820 に答える