3

この質問は、私がここで質問した別の質問(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で変更したときに自動的に同期させるため、そうであることを示しています。

答えて

1

StoreGeneratedPattern.Identityが有効です。 EF Designerで設定する場合は、EDMXファイルのSSDLとCSDLの両方の部分で正しく設定されていることを確認してください(XMLとして開いて確認してください)。 EFデザイナーにバグがあり、CSDLでのみ正しい設定が行われたため、挿入後に新しいIDをデータベースから選択する必要があることがSQL部分で分からなかった。このバグはinstalling VS 2010 SP1で解決されるまれなケースでしたが、それは確実にspecial patchによって解決されるはずです。

+0

の両方を変更せずに動作しないようです、また、私はSSDLとCSDLでStoreGeneratedPattern値の様々な組み合わせを試してみました。それらのどれも私のために働かない。 SQLEXPRESS DBを使用したテスト例では、新しいIDを照会するために次のSQL文が発行されます: '[dbo]。[ParentEntities]から@@ ROWCOUNT> 0および[id] = scope_identity()'のselect [id] scope_identity関数はID列に対してのみ機能しますが、ID列を持たないため、IDをトリガーに生成します。 –

+0

はいCSDLとSSDLの両方の値が同じである必要があります。この問題を回避するには、エンティティを挿入するためのカスタムストアドプロシージャ(およびおそらくは更新と削除)を作成し、ストアドプロシージャでUDFを呼び出して正しいIDを返します。 –

+0

あなたの答えをありがとう。 'StoreGeneratedPattern.Identity'とprimarykeyカラムの組み合わせがidentity-/autoincrement-columnsでのみ機能するかどうか(これは生成されたIDをクエリする動作がDBMS固有のEFプロバイダに依存すると思います) *データベースのトリガーではありませんか? –

0

私は同じ問題を抱えていました。列の1つにトリガーが設定されていました。

しかし、私がVS EDMXデザイナー(設定されていなかった「アイデンティティー」)とのトラブルを持っていたように見え、それはそれを手動で修正する助けた(1モデルが正しい値を持っていましたが、他はしませんでした)。

次に、予期しない行数(0)に影響するStore update、insert、またはdelete文があります。エンティティがロードされてからエンティティが変更または削除されている可能性があります。それは簡単に私がCSDLでStoreGeneratedPatternを設定した場合、私は 同じSSDLの値(およびその逆)に設定しなければならないの次instuctions here

を修正しましたか?

はい、それは私がパッチがインストールされているCSDLとSSDL

関連する問題