2012-03-05 2 views
7

によって私はこのようなアプリケーションを移行しています:NHibernateは立ち退かせることによってタイプの代わりに、インスタンス

Vehicle v = null; 
using (ISession session = MyNHibernateSession()) 
{ 
    v = Vehicle.FindById(1); 
} 

using (ISession session = MyNHibernateSession()) 
{ 
    // somwwhere into these4 lines Vehicle comes Finded 
    DoSomething(); 
    DoSomething2(); 
    DoSomething3(); 
    DoSomething4(); 
    DoSomething5(); 
    DoSomething6(); 

    // if i do this i get an error "another object with the same id etc etc etc 
    session.Update(v); 
} 

私はこのような何かを行うにwan't:

session.EvictAllByType(typeof(Vehicle)); 

が、それは可能ですか?どのように?、 ありがとう

+0

セッションをクリーンアップするには、いつでも 'session.Clear()'を実行できます。 –

+0

session.clear()セッションオブジェクトをクリアする必要があります。車種オブジェクト、thanx – manuellt

答えて

0

IMHO vは第2セッションに属していないので、あなたのケースでは解決策はないと思います(すべての車両が不足している場合)。

私の提案は以下のように第二のセッションにVを添付することです:

... 
using (ISession session = MyNHibernateSession()) 
{ 
    session.Lock(v, LockMode.None); 

    // somwwhere into these4 lines Vehicle comes Finded 
... 
+0

Thanx @Martha、私のオブジェクトは自分の状態を変更し、更新/マージする必要があるかもしれません。私の目的は、次のコードが多かれ少なかれ他の(非鉱山の)乗り物を必要とするかもしれないからです。 – manuellt

7

この質問は古いかもしれないが、それを行う方法を探しながら、私はここで終わりました。だから私はそれをやり終えたのです:

public static void EvictAll<T>(this ISession session, Predicate<T> predicate = null) 
    { 
     if (predicate == null) 
      predicate = x => true; 
     foreach (var entity in session.CachedEntities<T>().Where(predicate.Invoke).ToArray()) 
      session.Evict(entity); 
    } 

    public static IEnumerable<T> CachedEntities<T>(this ISession session) 
    { 
     var sessionImplementation = session.GetSessionImplementation(); 
     var entities = sessionImplementation.PersistenceContext.EntityEntries.Keys.OfType<T>(); 
     return entities; 
    } 
+0

+1私は今日これを実装しました。これは便利でした:)正確にはどこの状況で見るべきか分かりませんでした。 – Lukazoid

関連する問題