2015-07-23 6 views
1

У меня странное поведение NHibernate и ADO.NET. Я использую NHibernate как стандартную ORM, но некоторые операции быстрее с ADO.NET (например, пакетная или вызов хранимой процедуры).Nhibernate последующее чтение после вызова хранимой процедуры

Так я делаю следующее

var item = _items.GetById(100); 

Затем я вызова хранимой процедуры, которые обновить ту же сущность со следующими инструкциями

var session = _sessionManager.OpenSession(); 
using (var tx = session.BeginTransaction()) 
{ 
     var item = _items.GetAll().FirstOrDefault(x => x.ItemCode == code); 

     var cmd = session.Connection.CreateCommand(); 
     session.Transaction.Enlist(cmd); 
     cmd.CommandType = CommandType.StoredProcedure; 

     SqlParameter id = SQLUtil.GetParam("@bigId", SqlDbType.BigInt, inout: false); 

     cmd.CommandText = "storedUpdateItem"; 
     cmd.Parameters.Add(SQLUtil.GetParam("@tstTS", SqlDbType.Timestamp, inout: false)); 
     cmd.Parameters.Add(id); 

     int ret = cmd.ExecuteNonQuery(); 
     if (ret != 1) 
     { 
      throw new ApplicationException("Something gone wrong with update"); 
     } 
     tx.Commit(); 

     return _items.GetById(id.Value); 
} 

Так последняя операция, чтобы получить еще раз, используя Хранилище NHibernate разбивает элемент. Проблема в том, что элемент не обновляется с базой данных. Кажется, это предыдущая версия. Есть идеи?

ответ

0

Вы можете заставить NHibernate обновить кэшированную версию item с помощью Refresh метод session объекта:

 ... 
     var item = _items.GetById(id.Value); 
     session.Refresh(item); 
     return item; 
}