Устаревшая база данных смешивает первичные и внешние ключи: ошибка обновления "Свойство является частью ключевой информации объекта и не может быть изменено"

Рассмотрим следующие таблицы:

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 возвращается без ошибок.

0 ответов

Другие вопросы по тегам