3

これは私のモデルです:

 - Business
   - BusinesType - FK
   - Categories (*) - FK
   - Branch (*)
     - BranchType - FK
     - Address
     - Phone (*)
     - CustomFields (*)
     - OpeningTimes (*)
       - WorkingPeriods (*)
   - .....

Businessこれで、すべてのプロパティとコレクションが適切に設定された単一のエンティティとして、一連のデータ全体で構成されるフォームを受け入れるコントローラー アクションができました。

ここで、すべてのプロパティとコレクションを再帰的に調べて、データベース グラフと比較する必要があります。それらが存在しない場合は追加し、すべてのプロパティを再度調べて、ナビゲーション プロパティがなくなるまで同じことをより深いレベルで実行します。前の例で述べたよりも多くのプロパティと子孫があるので、それらを手動で見ていくだけです。

この回答のおかげで、状況に対する素晴らしい解決策を提供する GraphDiff を見つけました。

私が呼び出している更新クエリは次のとおりです。

    Context.UpdateGraph(business, bus => bus
      .AssociatedEntity(bu => bu.BusinessType)
      .AssociatedCollection(bu => bu.Categories)
      .OwnedCollection(bu => bu.Branches, branch => branch
        .AssociatedEntity(b => b.BranchType)
        .OwnedEntity(b => b.Address)
        .OwnedCollection(b => b.Phones)
        .OwnedCollection(b => b.CustomFields)
        .OwnedCollection(b => b.OpeningTimes, openingTimes => openingTimes
          .OwnedCollection(b => b.WorkingPeriods)
        )
      )
    );

次の例外がスローされます。

System.InvalidCastException: タイプ 'System.Linq.Expressions.MethodCallExpressionN' のオブジェクトをタイプ 'System.Linq.Expressions.MemberExpression' にキャストできません。

ソース コードのデバッグを試みましたが、私は式ツリーの専門家ではありません。内部Include呼び出し (ストア オブジェクトをロードするためのオブジェクト グラフを含めるため) がアタッチしようとすると、問題が発生しWorkingPeriodsます。再帰。少しいじりましたが、式ツリーに関する幅広い知識を持っている人なら、これを簡単に解決できると確信しています。その上で何か提案をいただければ幸いです。

インクルード パス式は次のように生成されるはずです。

.Include(b =>
  b.Branches.Select(br =>
    br.OpeningTimes.Select(ot =>
      ot.WorkingPeriods)));

エラーのスタックトレースは次のとおりです

基本的に、再帰呼び出しは内部インクルードをメソッド呼び出しとして返し、それを処理せずに、公開することを意図したコレクション プロパティを返すため、例外がスローされます。

4

1 に答える 1

2

申し訳ありませんが、返信に時間がかかりました。

私は午前 3 時で、かなりの量のワインを飲みましたが、問題は解決しました :) @ https://github.com/refactorthis/GraphDiffで最新バージョンのコードを入手すれば、問題なく動作するはずです。

新しい nuget パッケージ (RefactorThis.GraphDiff) をすぐに更新します。

于 2013-07-13T17:26:12.253 に答える