3

この質問は、私がここで尋ねた別の質問 ( Entity Framework 4.2 - データベースで生成された主キー値で TPT 継承を実現する方法は? ) に関連しており、トピックに記載されている問題に関する私の仮定が正しいかどうかを単純に明確にする必要があります。 .

問題(詳細):

  • EF (4.1) を使用して、既に存在するデータベースにアクセスしたい
  • データベースには、そのテーブルの主キー値の生成に関していくつかの制限があります (テーブル名を取り、次に利用可能な ID を返す UDF があります)
  • できるだけ簡単にするために、私の最初のアプローチは、ID 生成 UDF を呼び出して新しいデータ行の挿入時に新しい ID を設定するデータベース トリガーを (挿入前に) 定義することでした。
  • 次に、EDM の csdl 内の対応するエンティティの StoreGeneratedPattern プロパティを「Identity」に設定して、新しく生成された ID が DB に保存された後にエンティティ オブジェクトに設定されるようにします。

この結果は次のとおりです。

新しいエンティティ オブジェクトを作成し、それを DbContext に追加して SaveChanges を呼び出すと、対応するデータ行がデータベースに挿入されましたが、エンティティは新しいデータベース生成 ID で更新されませんでした。親の新しいIDが親に知られていないため、子エンティティの外部キープロパティを正しく設定できなかったため、相互に関連付けられている(親子)複数を一度に保存しようとしたときにこれに気付きましたDb コンテキスト。

これが、TPT 継承に関する上記の質問をした理由です。

数日間の調査と、この問題を解決するために頭に浮かんだすべてのことを試した後、これは単に機能しないことに気づきました。MSDN の StoreGeneratedPattern 列挙型のドキュメントとブログのいくつかの説明では、生成された値を取得するために StoreGeneratedPattern.Identity を設定する必要があることが示唆されていますが、DB が新しい行の挿入時に値を生成する場合、これは主キーの組み合わせには当てはまりません。データベーストリガー付き。

EF はデータベースで生成された値を取得するためにいくつかの基準が必要であり、ほとんどの場合、それはエンティティの ID になると思います。autoincrement (または ID 列など) に設定されたデータベース列の場合、DBMS は最後に挿入された ID 値 (MSSQL の @@identity など) を取得する機能を提供するため、問題はない可能性があります。しかし、トリガーを使用して新しい ID 値を生成する場合、EF は明らかに新しく挿入された行をクエリする方法を知りません (これを行うための適切な db に依存しない方法も想像できません)。

したがって、私の実際の質問は次のとおりです。上記の仮定は正しいですか、それともここで重要なことを見落としていますか?

これに関する明確化/インスピレーションを事前に感謝します。

編集(フォローアップの質問):

Ladislav からの回答を読んだ後、別の質問が発生します。

CSDL で StoreGeneratedPattern を設定した場合、SSDL で同じ値に設定する必要がありますか (逆も同様)? edm デザイナーのパッチは、CSDL で (デザイナーを介して) 変更すると、SSDL の StoreGeneratedPattern を自動的に同期するため、これが事実であることを暗示しています。

4

2 に答える 2

1

動作するStoreGeneratedPattern.Identityはずです。EF Designer で設定する場合は、EDMX ファイルの SSDL 部分と CSDL 部分の両方で正しく構成されていることを確認してください (XML として開いて確認してください)。CSDL でのみ正しい設定を引き起こす EF デザイナーにバグがあったため、挿入後にデータベースから新しい ID を選択する必要があることを SQL 部分が認識しませんでした。このバグは、まれにVS 2010 SP1 をインストールすることで解決される場合があり、特別なパッチによって確実に解決されるはずです。

于 2011-12-27T14:40:33.900 に答える