これは私のモデルです:
- 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)));
基本的に、再帰呼び出しは内部インクルードをメソッド呼び出しとして返し、それを処理せずに、公開することを意図したコレクション プロパティを返すため、例外がスローされます。