HTTP не имеет состояния. Ваша единица работы существует только на стороне сервера. Что касается нажатия «Загрузить», тогда ваше UOW просто извлекает запись и сопоставляется с вашей моделью представления. «Сохранить» и единица работы начинается, когда вы попадаете на сервер - вместо того, чтобы быть в процессе загрузки, отредактируйте в браузере, а затем вернитесь на сервер.
Реализация, при которой вам не следует хранить ISession в памяти (в вашем случае объект сеанса ASP.Net), это верный быстрый способ исчерпания памяти и неуправляемых ресурсов ado.net. Существуют различные примеры UOW, которые некоторые люди предпочитают связывать ISession с HTTP-контекстом в begin_request и размещать в end_request, вы, конечно, можете быть более детализированными, но во всех случаях он никогда не существует дальше этого.
В упрощенной системе при нажатии кнопки «Сохранить» вам нужно будет извлечь Продукт из базы данных, используя идентификатор (скрытое поле или что-то еще), установить свойства из Request.Form, а затем обновить в базы данных.
Что касается параллелизма. Если вы записали метку времени или инкрементную версию в скрытом поле
<input type="hidden" name="version" value="12"/>
Затем, когда вы нажимаете Сохранить, вы извлекаете Продукт из базы данных, проверяете, совпадает ли номер версии в Request.Form, и затем сохраняете, если не вернете пользователю, что данные изменились с момента последнего получения, вы бы нравится продолжать? В NHibernate есть поля отметок времени / версии, поэтому сравнение выполняется, когда вы действительно попадаете в БД, как правило, в предложении where в обновлении, поэтому в этом случае он даже учитывает изменения в момент фиксации.
Существуют более сложные и изощренные способы, но обычно вы не можете / не должны вставлять ISession в объект Session asp.net.