EF4で親子関係を持つエンティティを保存しようとすると問題が発生しています。子供が親の前に挿入されることもありますが、これは明らかに参照制約の観点から問題を引き起こします。 2つのテーブルは次のように構成されています。外部キーが公開されていないエンティティが不正な順序で保存される
OrderHeader
- OrderID (PK)
OrderDetails
- OrderID (PK)
- DetailID (PK)
(これ以上の列はありますが、それは関係ありません)。
メモ: OrderDetails.OrderIDに真の外部キーを公開するのではなく、トリガーを使用してDetailsテーブルのOrderIDがHeaderテーブルに存在するように強制します。 FKを公開するのは簡単な解決策かもしれませんが、私たちのアプリケーションではデータベースへの変更は許されません。つまり、従来のコードなどを扱わなければなりません。
.edmxファイルのXMLデザイナーが生成する、私はそれが概念モデル(CSDLセクション)でAssociationSetとAssociationを作成し、AssociationがReferentialConstraintでセットアップされていることに気づいた。ただし、SSDLセクションにAssociateSetまたはAssocationは作成されません。 FKがデータベースに公開されている場合にのみ追加されるようです。私が(AdventureWorksやNorthwindのような)データベースで真のFKをテストした他のデータベースについては、データベースからモデルを生成すると、EDMXにSSDLのAssociationおよびAssociationSetセクションが含まれていることがわかります。
EFは、モデル(CSDL)にあるアソシエーションを無視して、テーブル名のアルファベット順に挿入するように見えます。このため、OrderDetailはOrderHeaderより前にソートしています(そして、テーブルの名前を変更する権限があります)。対応するアソシエーションセットとアソシエーションをSSDLセクションに手動で追加すると、正しい順序で保存が行われます(最初にヘッダを挿入してからDetailを挿入します)。しかし、「データベースからモデルを更新する」という操作を行うたびに、これらの手動による変更がなくなるため、実際的ではありません。私は実行時にその修正を動的に行うことを考えましたが、「うまくいくはず」を回避するためには多くの努力が必要です。
私は、EFがインサートを注文するときにCSDLで定義されている参照制約および/または関連を尊重する方法があると考えています。
再現性のあるサンプルがありますか?私はこれを何度もやっただけで、(EFv4では)うまくいった。 –
これはFKなしで機能しましたか?それは毎回私のために壊れます。同僚がEFフォーラムの詳細を投稿しました。ここで再現可能なケースを見ることができます:http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/31ffcfa0-e69e-460b-a767-d28376a57fe9大きなことはアソシエーションを持たないようですSSDLセクションのAssociationSetそれがあなたのために働くとき、SSDLセクションに協会がありますか? –
もちろん、特殊なトリガを持たない場合や、SQLをプロファイリングしていない場合、「間違った」動作を見落とすのは簡単です。 FKがなければ、SQL Serverはヘッダーの前に詳細を挿入させる可能性がありますが、それは間違った動作です。 –