2014-11-02 4 views
0

Я использую gridview в C# и пытаюсь удалить строку. Я использую nHibernate с сеансом за запрос. Моя проблема в том, что когда я удаляю и выполняю команду строки, я могу удалить запись в db, но когда я пытаюсь перезагрузить источник данных, потому что удаление еще не выполнено, я, кажется, извлекаю исходные данные в тот же сеанс.nHibernate Session-Per-Request Удаление и фиксация до завершения сеанса

Может кто-нибудь сказать мне, какая лучшая стратегия заключается в том, чтобы справиться с этим сценарием?

Большое спасибо! Sid

+0

Лучшим сценарием является ** SPLIT ** действия по записи и чтению. Например. Я использую Delete для удаления, затем перенаправляю List() в MVC или просто DELETE-метод, а затем Find via GET с помощью Web API. Мы никогда не должны сочетать эти ... –

+0

http://stackoverflow.com/questions/13131796/nhibernate-caching-issue-when-to-call-evict – user1618077

ответ

1

Вы должны выполнить две транзакции. В WebForms, ваш код может выглядеть следующим образом:

using (var transaction = Session.BeginTransaction()) 
{ 
    var foo = Session.Load<Foo>(fooId); 
    Session.Delete(foo); 

    transaction.Commit(); 
} 

using (var transaction = Session.BeginTransaction()) 
{ 
    gridView.DataSource = Session.List<Foo>(fooId); 
    gridView.DataBind() 

    transaction.Commit(); 
} 

Как Радим Колер говорит, если вы делаете это более современный RESTful пути в MVC, вы должны иметь клиент делает два вызова вашего API - на Delete вызова , затем вызов списка. Принцип тот же, хотя вам нужны две транзакции.

Я не совсем уверен, почему NHibernate не использует AutoFlush в вашем сценарии, но если вы вообще не открываете транзакцию, вы можете обнаружить, что функция AutoFlush NHibernate не работает должным образом.

+0

Точно. Кроме того, Сид, проверьте настройки [FlushMode] (http://nhforge.org/doc/nh/en/index.html#manipulatingdata-flushing), а между тем вызов вызывают 'session.Flush()' перед фиксацией ... –

+0

Я использую session-per-request с HttpWebModule, это создает сеанс и транзакцию в Application_BeginRequest и фиксирует и завершает сеанс в Application_EndRequest. Это неправильно для того, что я хотел бы сделать? Похоже, что когда я выдаю команду delete, она удаляет, а затем извлекает и восстанавливает сетку, затем фиксирует весь лот в конце запроса. Есть ли способ, по которому я могу завершить транзакцию и совершить на полпути через запрос, а затем начать новую транзакцию и позволить Application_EndRequest завершить вызов повторной последовательности? – Sid

+0

@Sid Да, вы должны открыть сеанс только для запроса на начало и конец запроса. Вы должны открывать транзакции в своем коде контроллера/кода. Иногда у вас будет больше одной транзакции, открытой для каждого запроса. Транзакции должны быть открыты для минимального количества времени и должны относиться к одному «деловому действию». Например, если вы выполняете отслеживание пользователей в модуле http, который вы хотите выполнить в своей собственной транзакции. Обратите внимание, что вам потребуется какой-то способ доступа к текущему открытому сеансу для запроса (например, сохранить переменную сеанса в HttpContext.Current.Items). – cbp

Смежные вопросы