БП>Если Вы ещё раз вызовете UpdateSql, то что должно произойти? БП>Если потом ещё раз поменяете первичный ключ и снова вызовете UpdateSql, то что должно произойти?
преставим ситуацию
UPDATE House SET HouseId = 10 WHERE HouseId=5
У нас меняется PK с 5 на 10
при повторном вызове этой команды ничего не произойдет, т.к. записи с HouseId=5 уже нет
Что в общем не противоречил логике, т.к. не были применение изменений.
Старое значение PK в объекте сохраняеться пока не вызвана AcceptChanges()
а т.к. сначала идет Update а потом AcceptChanges() то пример такой
Изначально HouseId = 5
Пример 1.
h.HouseId = 10
UpdateSql(h) -> генерирует UPDATE House SET HouseId = 10 WHERE HouseId=5
// Это уже нарушение логики, т.к. в базу уже нет HouseId=5
h.HouseId = 11
UpdateSql(h) -> генерирует UPDATE House SET HouseId = 11 WHERE HouseId=5
Пример 2.
h.HouseId = 10
UpdateSql(h) -> генерирует UPDATE House SET HouseId = 10 WHERE HouseId=5
h.AcceptChanges()
// все нормально, т.к. старое значение HouseId=10 после AcceptChanges()
h.HouseId = 11
UpdateSql(h) -> генерирует UPDATE House SET HouseId = 11 WHERE HouseId=10
h.AcceptChanges()
В случае транзакции мы просто откатываем и объект.
БП>Тонкость в том, что "предыдущее значение" всегда должно соответствовать значению на сервере, иначе вся идея обламывается. БП>Следовательно нужен механизм, отслеживающий успешные изменения полей первичного ключа и обновляющих то самое пресловутое значение. БП>И откатывающий все обратно при откате транзикции. Я за Игоря не скажу, но по моему мнению попытка реализовать подобную систему привнесёт граблей больше, чем удобства. БП>Вам проще завести отдельный метод и явно менять у записей первичные ключи. Или сделать всё-таки вырожденный PK, а HouseId сделать обычным полем с уникальным индексом.
Не охота просто иметь ненармализованную БД где будут кучи PK (один логический, другой физический).
Хотя если такой функциональности не реализовано, то это самое простое и логичное решение.
Я знаю что внутрях есть старые значения атрибутов, наверху можно узнать менялся он или нет, а вот старое значение вытащить просто не смог.