Рассмотрим следующие таблицы:
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 возвращается без ошибок.