Устаревшая база данных смешивает первичные и внешние ключи: ошибка обновления «Свойство является частью ключевой информации объекта и не может быть изменено» - PullRequest
2 голосов
/ 21 ноября 2011

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

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
)

Таблица содержит внешний ключ от столбца № до столбца №. Обе таблицы отображаются на сущности с первичными ключами базы данных в качестве ключей сущностей. Между Мастером и Деталью существует отношение один ко многим.

Когда я добавляю мастер с одной деталью в контекст EF и вызываю SaveChanges, поле nr в мастере определяется триггером в базе данных, возвращается в EF, записывается в свойство details.nr и сохраняется в таблица деталей. Молодец, ЭФ!

Но когда я пытаюсь обновить одно из полей сведений в объекте сведений и вызвать SaveChanges, я получаю ошибку «Свойство Nr является частью ключевой информации объекта и не может быть изменено». Очевидно, EF пытается обновить поле Nr от соответствующего мастера. Который, конечно, не модифицирован.

Каков наилучший способ обойти это ограничение? Добавление нового поля ключа сущности и изменение столбцов первичного ключа не вариант.

Отказ от ответственности: я написал код от руки, чтобы сосредоточиться на проблеме, он может не компилироваться, но я надеюсь, что вы поняли.

Обновление : Я думаю (надеюсь ...), что проблема решена. Если для поля SCN в объекте Detail установить значение ConcurrencyMode = Fixed AND StoreGeneratedPattern = Computed, появится сообщение об ошибке в поле Nr. Если для полей SCN установить значение ConcurrencyMode = Fixed и StoreGeneratedPattern = None, SaveChanges возвращается без ошибок.

...