Reputation: 689
I'm migrating an application like this:
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);
}
I wan't to do something like this:
session.EvictAllByType(typeof(Vehicle));
is it possible? how?, thanks
Upvotes: 7
Views: 1798
Reputation: 968
This question may be old, but I ended up here while searching for how to do it. So this is how I ended up doing it:
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;
}
Upvotes: 8
Reputation: 21
IMHO I don't think evict is the solution in your case since the v doesn't belong to the 2nd session (so if you evict all vehicles is not enough).
My suggestion is to attach v to the second session like:
...
using (ISession session = MyNHibernateSession())
{
session.Lock(v, LockMode.None);
// somwwhere into these4 lines Vehicle comes Finded
...
Upvotes: 0