次の表を検討してください。
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 への外部キーがあります。両方のテーブルは、プライマリ データベース キーをエンティティ キーとしてエンティティにマップされます。マスターとディテールの間には 1 対多の関係があります。
1 つの詳細を持つマスターを EF コンテキストに追加し、SaveChanges を呼び出すと、データベース内のトリガーによってマスターの nr フィールドが決定され、EF に返され、details.nr プロパティに書き込まれ、詳細テーブルに保存されます。よくやった、EF!
しかし、詳細エンティティの詳細フィールドの 1 つを更新して SaveChanges を呼び出しようとすると、「プロパティ 'Nr' はオブジェクトのキー情報の一部であり、変更できません」というエラーが表示されます。どうやら EF は、関連するマスターから Nr フィールドを更新しようとします。もちろん、これは変更されていません。
この制限を回避する最善の方法は何ですか? 新しいエンティティ キー フィールドを追加し、主キー列を変更することはできません。
免責事項: この問題に焦点を当てるためにコードを手作業で書きました。コンパイルできない可能性がありますが、要点を理解していただければ幸いです。
更新:問題は解決したと思います(願っています...)。詳細エンティティの SCN フィールドを ConcurrencyMode=Fixed と StoreGeneratedPattern=Computed の両方に設定すると、Nr フィールドに関するエラー メッセージが表示されます。SCN フィールドを ConcurrencyMode=Fixed および StoreGeneratedPattern=None に設定すると、SaveChanges はエラーなしで返されます。