この質問は、私がここで質問した別の質問(Entity Framework 4.2 - How to realize TPT-Inheritance with Database-generated Primarykey Value?)に関連しており、トピックに記載されている問題に関する私の前提が正しいかどうかを簡単に明確にすべきです。StoreGeneratedPattern.Identityをdatabase-trigger生成のプライマリキー値で使用することはできませんか?
問題(詳細):
- 私はデータベースにアクセスするためにEF(4.1)を使用したい、すでに
- が存在するデータベースがプライマリキー値の生成に関するいくつかの制限があります
- 私ができるだけ簡単にするために、私の最初のアプローチはID生成を呼び出すデータベース・トリガー(挿入前)を定義することでした。 UDFを使用して新しいデータローを挿入するときに新しいIDを設定する
- 新しく生成されたIDがDB
にそれらを保存した後、エンティティオブジェクトに設定されますように、私は、私のEDMへの「アイデンティティ」のCSDLで対応するエンティティのStoreGeneratedPatternプロパティを設定
新しいエンティティオブジェクトを作成してDbContextに追加し、SaveChangesを呼び出すと、対応するデータローがデータベースに挿入されましたが、エンティティが新しいデータベースエンティティで更新されませんでした。生成されたID。私は、親の新しいIDが親に知られていなかったので、子エンティティの外部キーのプロパティを正しく設定できなかったため、一度に多くのデータを保存しようとしたときにこれを認識しました。 DbContext。
これがTPT継承に関する上記の質問をした理由です。
数日間の研究とこの問題を解決するために私の心に来たすべてのことを試してみたら、これは単純に機能しないと私は気づいたと思います。 MSDNのStoreGeneratedPattern enumのドキュメントとブログのいくつかの説明が示唆しているが、StoreGeneratedPattern.Identityは生成された値を取得するように設定する必要があります.DBが新しい行の挿入時に値を生成するとき、データベーストリガーを使用します。
EFがデータベース生成値を取得するためにいくつかの基準を必要とするので、それは長い間、それは私にとって完全に論理的だと思っています。それはほとんどの場合、エンティティのアイデンティティであると思います。 DBMSが最後に挿入されたID値(MSSQLの@@ identityなど)を取得するための機能を提供するため、問題のないautoincrement(またはidentity-column、...)に設定されているデータベース列の場合。しかし、新しいアイデンティティ値を生成するためにトリガーを使用する場合、EFは明らかに新しく挿入された行を照会する方法を知りません(そして、これを行うには良いdbに依存しない方法があります)。
私の実際の質問は、上記の前提が正しいか、ここで重要なことを見落としていますか?
これについての明確化/インスピレーションをお寄せいただきありがとうございます。
編集(フォローの質問):
ラディスラフから答えを読んだ後、別の疑問が生じる:
私はCSDLでStoreGeneratedPatternを設定している場合は、私が(SSDLで同じ値に設定する必要がありませんおよびその逆)? edmデザイナのパッチは、SSDLのStoreGeneratedPatternを(デザイナを介して)CSDLで変更したときに自動的に同期させるため、そうであることを示しています。
の両方を変更せずに動作しないようです、また、私はSSDLとCSDLでStoreGeneratedPattern値の様々な組み合わせを試してみました。それらのどれも私のために働かない。 SQLEXPRESS DBを使用したテスト例では、新しいIDを照会するために次のSQL文が発行されます: '[dbo]。[ParentEntities]から@@ ROWCOUNT> 0および[id] = scope_identity()'のselect [id] scope_identity関数はID列に対してのみ機能しますが、ID列を持たないため、IDをトリガーに生成します。 –
はいCSDLとSSDLの両方の値が同じである必要があります。この問題を回避するには、エンティティを挿入するためのカスタムストアドプロシージャ(およびおそらくは更新と削除)を作成し、ストアドプロシージャでUDFを呼び出して正しいIDを返します。 –
あなたの答えをありがとう。 'StoreGeneratedPattern.Identity'とprimarykeyカラムの組み合わせがidentity-/autoincrement-columnsでのみ機能するかどうか(これは生成されたIDをクエリする動作がDBMS固有のEFプロバイダに依存すると思います) *データベースのトリガーではありませんか? –