2012-03-05 18 views
7

Tôi đang di chuyển một ứng dụng như thế này:NHibernate đuổi theo loại thay vì bằng cách dụ

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

tôi wan't để làm một cái gì đó như thế này:

session.EvictAllByType(typeof(Vehicle)); 

là nó có thể? làm thế nào ?, cảm ơn

+0

Bạn luôn có thể thực hiện 'session.Clear()' để xóa phiên. –

+0

session.clear() xóa tất cả các đối tượng đã được giao, tôi cần xóa các đối tượng kiểu Vehicle, thanx – manuellt

Trả lời

0

IMHO Tôi không nghĩ rằng trục xuất là giải pháp trong trường hợp của bạn vì v không thuộc phiên thứ 2 (vì vậy nếu bạn đuổi tất cả các phương tiện là không đủ).

Đề nghị của tôi là để đính kèm v với phiên thứ hai như:

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

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

Thanx @Martha, đối tượng của tôi có thể đã thay đổi trạng thái của mình và cần được cập nhật/hợp nhất, tôi làm mọi thứ với đối tượng của tôi đối tượng của tôi, bởi vì mã tiếp theo có thể cần các phương tiện khác (không phải của tôi) để xen kẽ, thanx một lần nữa. – manuellt

7

Câu hỏi này có thể là cũ, nhưng tôi đã kết thúc ở đây trong khi tìm kiếm làm thế nào để làm điều đó. Vì vậy, đây là cách tôi đã thực hiện:

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 Tôi đã thực hiện điều này ngày hôm nay và điều này có ích :) Không chắc chắn nơi chính xác để tìm trong bối cảnh tồn tại. – Lukazoid

Các vấn đề liên quan