3

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 の関係。

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

前に、投稿メソッドで、次のプロセスに従いました。

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

このワークフローは、数週間うまくいきました。それから先週何かが変わり、それはもう機能しません。保存操作の代わりに、次の例外が発生します。

UpdateException: 「'DIR2_5Entities.ReportSourceSet' のエンティティ
「FK_ReportSources_ReportSourceTypes」関係に参加します。
0 件の関連する 'ReportSourceTypes' が見つかりました。1 'Report_Source_Types' が必要です。"

デバッグ ビジュアライザーには次のように表示されます。

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

SQL Profiler では、準備された SQL ステートメントは問題ないように見えます。誰かが私が見逃している明白なことを教えてもらえますか?

ティア

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

4

6 に答える 6

6

私はこれに遅れていることに気づきましたが、同様の問題があり、解決策を思い付く前に約 3 時間ハッキングしました。私はコードを投稿したいと思いますが、それは家にあります - 誰かがそれを必要とする場合、後で行うことができます

確認すべき点は次のとおりです。

  • SaveChanges() 呼び出しにブレークポイントを設定し、オブジェクト コンテキストを詳細に調べます。コンテキストへの追加と変更のリストが表示されます。最初に見たとき、関連オブジェクトを指すだけでなく、すべての関連オブジェクトを追加しようとしていることがわかりました。あなたの場合、コンテキストが新しい Report_Source_Type を追加しようとしている可能性があります。
  • 前のポイントに関連しますが、レポート ソースを取得する場合は、エンティティ キーによってデータベースから取得され、コンテキストに適切に関連付けられていることを確認してください。そうでない場合、コンテキストはそれを新しいアイテムと見なす可能性があるため、必要な関係が設定されません。

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

于 2010-02-25T23:48:40.767 に答える
2

テーブルに主キーがなく、FK 参照はあるが PK がないため、このエラーが発生しました。

PK を追加してモデルを更新すると、すべて問題ありません。

于 2010-09-23T21:02:55.287 に答える
1

ReportSource が NoTracking オプションで読み込まれたかどうか、またはその EntityState == 'Detached' かどうかを確認してください。もしそうなら、それはあなたの問題です。コンテキストにロードする必要があります。

于 2009-08-19T17:55:16.683 に答える
0

「追加」状態で「舞台裏」を作成した新しいオブジェクトインスタンスが原因で、同じエラーが発生しました。これは明らかではありませんでした。

于 2010-04-06T15:01:22.197 に答える
0

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

于 2009-12-02T19:16:23.313 に答える
0

新しいエンティティをコンテキストに追加したときにこのエラーが発生しましたが、新しいエンティティをオブジェクト グラフの親のコレクションに追加するのを忘れていました。

例えば:

Pet pet = new Pet();
context.Pets.Add(pet);
// forgot this: petOwner.Pets.Add(pet);
于 2016-10-13T00:21:32.240 に答える