Re[2]: Update PrimaryKey или первоначальное значение
От: krupoderov  
Дата: 12.04.06 09:09
Оценка:
БП>Если Вы ещё раз вызовете 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 (один логический, другой физический).
Хотя если такой функциональности не реализовано, то это самое простое и логичное решение.

Я знаю что внутрях есть старые значения атрибутов, наверху можно узнать менялся он или нет, а вот старое значение вытащить просто не смог.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.