Устаревшая база данных смешивает первичные и внешние ключи: ошибка обновления "Свойство является частью ключевой информации объекта и не может быть изменено"
Рассмотрим следующие таблицы:
create table master
( nr number(10,0) identity primary key
lastmodified date
scn number(12,0) -- update from sequence with every update
)
create table details
( nr number(10,0) primary key
linenum number(3,0) primary key
<more details>
scn number(12,0) -- update from sequence with every update
)
Детали таблицы имеют внешний ключ от столбца nr до столбца nr. Обе таблицы отображаются на сущности с первичными ключами базы данных в качестве ключей сущностей. Между Мастером и Деталью существует отношение один-ко-многим.
Когда я добавляю мастер с одной деталью в контекст EF и вызываю SaveChanges, поле nr в мастере определяется триггером в базе данных, возвращается в EF, записывается в свойство details.nr и сохраняется в таблице подробностей. Молодец, ЭФ!
Но когда я пытаюсь обновить одно из полей сведений в объекте сведений и вызвать SaveChanges, я получаю сообщение об ошибке "Свойство Nr является частью ключевой информации объекта и не может быть изменено". Очевидно, EF пытается обновить поле Nr от соответствующего мастера. Который не изменен, конечно.
Каков наилучший способ обойти это ограничение? Добавление нового поля ключа сущности и изменение столбцов первичного ключа не вариант.
Отказ от ответственности: я написал код вручную, чтобы сосредоточиться на проблеме, он может не скомпилироваться, но я надеюсь, что вы поняли суть.
Обновление: я думаю (надеюсь...), что проблема решена. Если для поля SCN в объекте Detail установить значение ConcurrencyMode=Fixed AND StoreGeneratedPattern=Computed, появится сообщение об ошибке в поле Nr. Если для полей SCN установить значение ConcurrencyMode = Fixed и StoreGeneratedPattern=None, SaveChanges возвращается без ошибок.