Entity Frameworkが2レベルの関係を持つ新しいエンティティをSaveChangesしない

entity-framework savechanges

質問

私はADO.NET Entity Frameworkを使用してASP.NET MVCサイトを構築しています。私は、外部キーによって関連付けられたこれらのエンティティを含むエンティティモデルを持っています。

レポート(ID、日付、見出し、Report_Type_IDなど)

  • SubReport(ID、ReportTextなど) - Reportとの1対1の関係。
    • ReportSource(ID、Name、Description) - Sub_Reportとの1対多の関係。
      • ReportSourceType(ID、Name、Description) - ReportSourceとの1対多の関係。
      • 連絡先(ID、名前、住所など) - Report_Sourceとの1対1の関係。

SubReportの種類ごとにCreate.aspxページがあります。 postイベントメソッドは新しいSub_Reportエンティティを返します。

以前、私の投稿方法では、私はこのプロセスに従った:

  1. ページのフィールドから新しいReportエンティティのプロパティを設定します。
  2. ページのフィールドからSubReportエンティティの特定のプロパティを設定します。
  3. SubReportエンティティのReportを1で作成した新しいReportエンティティに設定します。
  4. ページから提供されたIDを指定して、ReportSourceを調べ、Sub_ReportエンティティのReportSourceを見つかったエンティティに設定します。
  5. 変更内容を保存。

このワークフローは、数週間でうまくいきました。それから先週何かが変わったし、それはもううまくいきません。今すぐ保存操作の代わりに、私はこの例外を得ます:

UpdateException: "Entities in 'DIR2_5Entities.ReportSourceSet' 
participate in the 'FK_ReportSources_ReportSourceTypes' relationship. 
0 related 'ReportSourceTypes' were found. 1 'Report_Source_Types' is expected."

デバッグビジュアライザは以下を表示します。

  • SubReportのReportSourceが設定およびロードされ、そのすべてのプロパティが正しいです。
  • Report_Sourceには、有効なReportSourceTypeエンティティが添付されています。

SQLプロファイラでは、準備されたSQL文は問題ないようです。誰かが私が見逃している明白なことを私に指摘できますか?

TIA

注:この場合、ReportとSubReportは常に新しいエンティティです。 Reportエンティティは、さまざまな種類のレポートに共通のプロパティを含み、一般的なクエリに使用されます。サブレポートは、種類によって異なる追加パラメータを持つ特定のレポートです。 SubReportの種類ごとに実際には異なるエンティティセットがありますが、この質問はそれらすべてに当てはまりますので、私はSubReportを簡単な例として使用します。

受け入れられた回答

データベーステーブルが互いに1対1の関係にある場合、これが発生する傾向があります。あなたの例では、reportsourcesetはそれが参照しているどんなIDを持つreportsorttypesも期待します。私の関係が反対側のテーブルからの2つの主キーを一緒にリンクしているとき、私はこの問題に遭遇しました。


人気のある回答

私はこれには遅刻していますが、私は同様の問題を抱えており、解決策を思いつく前に約3時間ハックしました。私はコードを投稿しますが、それは自宅にあります - 誰かがそれを必要とするならば、私は後でそれをすることができます。

ここで確認することがいくつかあります:

  • SaveChanges()呼び出しにブレークポイントを設定し、オブジェクトコンテキストを詳しく調べます。あなたは文脈への追加と変更のリストを見るべきです。私が最初に見たとき、私はそれが単にそれらを指すのではなくすべての私の関連したオブジェクトを追加しようとしているのを発見しました。あなたの場合、コンテキストは新しいReport_Source_Typeを追加しようとしているかもしれません。
  • 前の点に関連しますが、レポートソースを取得している場合は、そのエンティティキーによってデータベースから取得され、コンテキストに正しく添付されていることを確認してください。そうでなければ、あなたのコンテキストはそれが新しいアイテムであると信じているかもしれず、それ故にその必要な関係は設定されないでしょう。

メモリから、 context.GetObjectByKeyメソッドを使用して参照を取得し、それらを元のオブジェクトのプロパティに割り当てる前に、 context.Attachメソッドを使用してそれらのオブジェクトをコンテキストに明示的に添付しました。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ