1

どの要素にも含まれていないルート オブジェクトのリストを追跡したいと考えています。次の疑似コードが機能するようにします。

using (session1 = [...]) {
  IList<FavoriteItem>list = session1.Linq<FavoriteItem>().ToList();
}

list.Add(item1);
list.Add(item2);
list.Remove(item3);
list.Remove(item4);
var item5 = list.First(i => i.Name = "Foo");
item5.Name = "Bar";

using (session2 = [...]) {
  session2.Save(list);
}

これにより、item1 と item2 が自動的に挿入され、item3 と item3 が削除され、item5 が更新されます (つまり、すべてのアイテムに対して session.SaveOrUpdate() を個別に呼び出したくありません)。

テーブルに関連付けられていない疑似エンティティを定義することはできますか? たとえば、Favorites クラスを定義し、その 2 つのコレクション プロパティをマップして、次のようなコードを書きたいとします。

using (session1 = [...]) {
   var favs = session1.Linq<Favorites>();
}
favs.FavoriteColors.Add(new FavoriteColor(...));
favs.FavoriteMovies.Add(new FavoriteMovie(...));

 using (session2 = [...]) {
  session.SaveOrUpdate(favs);  
}

FavoriteColors と FavoriteMovies は、Favorites クラスの唯一のプロパティで、IList と IList 型です。これら 2 つのコレクション プロパティのみを保持し、Favorites クラスは保持したくありません。

実際には、追加と削除を追跡し、親エンティティに属さず、それ自体を表す IPersistentCollection オブジェクトが必要です (エンティティのコレクション プロパティに発生するのと同じことが、親エンティティがない場合のみです)。コレクションがエンティティに属している場合、これは完全に機能し、その場合、2 つのセッション間でアイテムを追加および削除できます。

どんな助けでも大歓迎です。

4

2 に答える 2

0

疑似エンティティよりも簡単な解決策は、必要なものを管理するオブジェクトでリストをラップすることです。

public class FavoriteList : IEnumerable
{
  private List<FavoriteItem> list;
  private ISession session;
  public FavoriteList(ISession session) 
  {
    list = session.Linq<FavoriteItem>().ToList();
    this.session = session;
  }

  public void Add(FavoriteItem item)
  {
    session.SaveOrUpdate(item); 
    list.Add(item);
  }

  public void Remove(FavoriteItem item)
  {
     session.Delete(item); //or something like that
     list.Remove(item);
  }

  public IEnumerator GetEnumerator()
  {
     return (list as IEnumerable).GetEnumerator();
  }
}
于 2010-05-26T18:22:35.853 に答える
0

私はまだこの問題の本当の解決策を見つけていません。これまでの私の回避策は、コレクションを子コレクション プロパティとして、これまでに 1 つのインスタンスしか存在しない別のエンティティに追加したことです。ただし、このエンティティのインスタンスがさらに存在する場合、このソリューションは機能しなくなり、アイテムが追加または削除されるたびにバージョンがインクリメントされるという欠点があります。

もう 1 つの回避策は、プロパティ/列のない (ID を除く) 疑似エンティティを作成することでした。

私が考えることができる 3 番目の選択肢は、コレクション全体を毎回再作成することです。これは非常に遅く、他のエンティティがアイテムの 1 つを参照している場合は機能しません。

最後の代替手段は、ダーティ チェック機能を自分で再実装することですが、これは複雑さとコードの重複を追加します。

誰かがより良い代替案を知っていれば、コメントをいただければ幸いです。

于 2010-06-03T17:29:29.150 に答える