Если для сохраняемого вами адреса уже присвоен идентификатор, вы можете просто сделать следующее:
var customer = session.Get<Customer>(customerId);
Session.Merge(address); // This will copy your transient entity into
// ..an entity with the same id that is in the
// ..first level cache.
session.SaveOrUpdate(customer);
Вы получаете эту ошибку, потому что адрес с идентификатором 14 уже связан с вашим сеансом NHibernate. Поэтому, когда вы создаете новую отдельную временную сущность и пытаетесь сохранить ее с этим идентификатором, NHibernate выдает ошибку. Обычно это хорошо, потому что очень редко хочется делать то, что ты делаешь.
Гораздо лучшим вариантом было бы иметь ViewModel для полей адреса, которые могут быть изменены пользователем, а затем выполнить следующее:
var address = Session.Get<Address>(addressVM.Id);
Mapper.Map(addressVM, address); // This is some type of mapper to copy properties
// ..from one object to another. I like automapper
// ..for this
Session.SaveOrUpdate(address);