0

しばらくの間、すでに解決しようとしている問題があります。

シナリオは次のとおりです

その人は、データベースに新しいエンティティを挿入します。

挿入を開始するには、xml ファイルからコストのかかる変換を行い、いくつかの基本的なプロパティを埋める必要があります。

以前にこの xml を処理し、既に o オブジェクトとして変換されたオブジェクトをキャッシュの短い場所に格納したかったのです。

その後、このオブジェクトの他のプロパティを埋めるプロセスは非常に時間がかかるため、人が途中で停止して戻って終了できるようにしたいと考えています。ただし、このオブジェクトが挿入されたときにデータベースで行われるいくつかの検証のため、このオブジェクトを不完全なデータベースに保存することはできません。

私が片付けた解決策は、人が入力をやめたときにオブジェクトをシリアル化することでした。たとえそれがまだ完了していなくても、人が戻ってきて入力を続けるときよりも、オブジェクトを逆シリアル化して、人が続行できるようにします。

問題は、このオブジェクトをシリアル化しようとすると、遅延ロードのためにほぼデータベース全体を nihibernate シリアル化し、stackoverlow エラーが発生することです (ここでこのエラーを言うのはおかしいです笑)。

誰が私が何をすべきか考えていますか?

私が行ったことの1つは、オブジェクトをキャッシュに保持することでした(/net 4キャッシュがどのようにシリアル化したかはわかりませんが、動作するように継ぎ目があります)が、オブジェクトを取得するたびに、子オブジェクトの半分が失われ、常に正確に半分が失われます子どもたち ....

ライブの場合、キャッシュから取得しようとすると 20 アイテムの注文があり、再度取得しようとすると 10 アイテムで返されます。注文は 5 itens しかありません。

これを解決する方法を知っている人はいますか?

すでにそこで試しています

WCFを使用してレイジーロードされたエンティティをシリアル化するNHibernate

nHibernate クエリを JSON にシリアライズする

4

1 に答える 1

1

1つの方法は、最初に必要なものを投影してから、結果をDTOにシリアル化することです。

ただし、これを行うと、多くのセッター/ゲッターを使用してDTOを作成するという問題が発生します。単純な匿名タイプを作成し、代わりにシリアル化する方が簡単ではないでしょうか。これを説明するブログ投稿を書きました。

//first create our anonymous type DTO
var dto = new { 
    Id = 0L, 
    Source = string.Empty, 
    Destination = string.Empty, 
    Is301 = false
};

//notice the ListAs(dto) extension method
var model = Session.QueryOver<CmsRedirect>()
  .SelectList(s => s
    .Select(x => x.Id).WithAlias(() => dto.Id)
    .Select(x => x.Source).WithAlias(() => dto.Source)
    .Select(x => x.Destination).WithAlias(() => dto.Destination)
    .Select(x => x.Do301).WithAlias(() => dto.Is301)
  )
  .Take(take).Skip(page * pageSize)
  .ListAs(dto);

return Json(new { Total = total, List = model }, 
    JsonRequestBehavior.AllowGet);

ListAsは、単純な(っぽい)拡張メソッドです。(クレジットはFilipKinskýに送られます)

public static class NHibernateExtensions {
  public static IList<TRes> ListAs<TRes>(
      this IQueryOver qry, TRes resultByExample) {

    var ctor = typeof(TRes).GetConstructors().First();

    return qry.UnderlyingCriteria
      .SetResultTransformer(
        Transformers.AliasToBeanConstructor(
         (ConstructorInfo) ctor)
        ).List<TRes>();
  }
}

ただし、私の例では子コレクションをシリアル化しないため、これを手動で処理する必要がある場合があることに注意してください。

于 2012-08-26T10:11:36.273 に答える