2012-03-05 19 views
7

Estoy migrando una aplicación como ésta:Tipo NHibernate Expulsar Por ejemplo, en lugar de por

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

Me wa a hacer algo como esto:

session.EvictAllByType(typeof(Vehicle)); 

es posible? ¿cómo ?, gracias

+0

Siempre puede hacer una 'session.Clear()' para limpiar la sesión. –

+0

session.clear() borra todos los objetos de la sesión que necesito borrar solo objetos de tipo Vehicle, thanx – manuellt

Respuesta

0

EN MIh No creo que el desalojo sea la solución en su caso ya que el v no pertenece a la 2ª sesión (por lo que si desaloja a todos los vehículos no es suficiente).

Mi sugerencia es unir v para la segunda sesión como:

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

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

Thanx @Martha, mi objeto tal vez ha cambiado su estado y necesita ser actualizado/fusionado, hago cosas con mi objeto, inmediatamente desalojo mi objetivo, debido a que el próximo código puede necesitar otros vehículos (no míos) para intervenir, gracias nuevamente. – manuellt

7

Esta pregunta puede ser viejo, pero terminó aquí durante la búsqueda de cómo hacerlo. Así que así es como terminé haciéndolo:

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 Implementé esto hoy y esto fue útil :) No estaba seguro de dónde buscar exactamente en el contexto de la permeabilidad. – Lukazoid

Cuestiones relacionadas