Nhibernate 3のFuturesに問題があり、何が問題なのかわかりません。
次のコード(Futuresなし)は、期待どおりに機能します。
SessionHandler.DoInTransaction(transaction =>
{
var criteria = SessionHandler.Session.CreateCriteria<T>();
var clonedCriteria = (ICriteria)criteria.Clone();
var count = criteria
.SetProjection(Projections.RowCount())
.UniqueResult<Int32>();
var result = clonedCriteria
.SetMaxResults(PageSize)
.SetFirstResult(page * PageSize)
.List<T>();
ItemList = result;
TotalResults = count;
RecalculatePageCount();
});
SessionHandlerは、このコンテキストのセッションを格納するだけであり、DoInTransactionは便利なメソッドです。
public void DoInTransaction(Action<ITransaction> action)
{
using (var transaction = Session.BeginTransaction())
{
action(transaction);
transaction.Commit();
}
}
ここで、次のコードによりGenericAdoExceptionが発生します。
SessionHandler.DoInTransaction(transaction =>
{
var criteria = SessionHandler.Session.CreateCriteria<T>();
var clonedCriteria = (ICriteria)criteria.Clone();
var count = criteria
.SetProjection(Projections.RowCount())
.FutureValue<Int32>();
var result = clonedCriteria
.SetMaxResults(PageSize)
.SetFirstResult(page * PageSize)
.Future<T>();
ItemList = result;
TotalResults = count.Value;
RecalculatePageCount();
});
PostgreSQL 9.2、Npgsql 2.0.11.0、NHibernate3.3.1.4000を使用しています。それが重要な場合は、マッピングにFluentNHibernateを使用します。アドバイスをありがとうございます。
編集:さらに調査した結果、このエラーはアイテムを追加した後にのみ発生することがわかりました。開始時に、フォームにデータを読み込んでいますが、問題なく機能します。アイテムを追加した後にフォームにデータをリロードすると、例外が発生します。しかし、それはかなり奇妙です。アイテムが正しく追加されます。アイテムを追加または更新するためのコードは次のようになります。
if (IsEditing)
{
SessionHandler.DoInTransaction(tx => SessionHandler.Session.Update(CurrentItem));
}
else
{
SessionHandler.DoInTransaction(tx => SessionHandler.Session.Save(CurrentItem));
}
奇妙なことに、PropertyChangedイベントを発生させているときに、この例外が発生することがあります(時々、私は思います)。InnerExceptionが異なる場合があることに気づきました。スレッドの問題のように聞こえますが、先物なしで機能するのは奇妙です。しかし、私はデータをロードするためにスレッドを使用していません。アイテムを追加するためだけです(うーん、でも、アイテムが追加されたときに通知し、「そのメッセージ」に応答してアイテムをロードするため、ロードは別のスレッドで実行)
編集2:エラーはかなりランダムに見えます。時々私はそれを得る、時にはそうではない:S