2012-03-05 16 views
7

sto migrando una domanda come questa:Tipo NHibernate Evict By invece che per esempio

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

ho wan't a fare qualcosa di simile:

session.EvictAllByType(typeof(Vehicle)); 

è possibile? come ?, grazie

+0

Si può sempre fare un 'session.Clear()' per ripulire la sessione. –

+0

session.clear() cancella tutti gli oggetti di sessione ho bisogno di cancellare solo oggetti di tipo Veicolo, grazie – manuellt

risposta

0

IMHO Io non penso che lo sfratto sia la soluzione nel tuo caso poiché il v non appartiene alla seconda sessione (quindi se sfratti tutti i veicoli non è sufficiente).

Il mio suggerimento è quello di collegare v per la seconda sessione come:

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

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

Grazie @Martha, il mio oggetto forse ha cambiato il suo stato e deve essere aggiornato/unito, io faccio cose con il mio oggetto, evito immediatamente il mio oggetto, perché il prossimo codice forse ha bisogno che altri veicoli (non miei) interroghino, grazie ancora. – manuellt

7

Questa domanda può essere vecchio, ma ho finito qui durante la ricerca di come farlo. Così ho finito per farlo:

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 L'ho implementato oggi e questo è stato utile :) Non sapevo esattamente dove cercare il contesto di peristenza. – Lukazoid

Problemi correlati