Entity Framework を使用して巨大なプロジェクトに取り組んでいます。ほとんどすべてのエンティティを時間依存にしたため、エンティティ間の関係を使用することはできなくなりました (関係は自分で管理します)。発生した問題は、以前のように簡単にデータを照会できなくなったことです。というエンティティがあるとしStudent
ます。このエンティティにはBooks
、学生に属する (リスト) のコレクションが含まれています。各書籍には、同様にデータベースから取得される著者のプロパティが含まれています。すべての生徒に自分の本と対応する著者をロードするには、何百ものカスタム クエリ (fe linq) を作成するか、パフォーマンスに大きな影響を与える遅延ロードを行う必要があります。実際、Entity Framework の Inlude をリレーションなしで使用できれば素晴らしいと思います。これを達成する方法を知っている人はいますか?ありがとうございました。
2 に答える
Entity Framework がテーブル間の関係を管理していない場合.Include()
、SQL 呼び出しで結合を作成するものを使用する方法がありません。最良のオプションは、関連するエンティティを通常どおり親に追加することですが、[NotMapped]
属性を使用します。次に、カスタム SQL 呼び出しを使用してルックアップを実行し、必要に応じてプロパティを設定できます。ただし、エンティティは「時間依存」であるため、データベース内の単なる外部キーである関係を使用できないというあなたの声明に混乱しています...おそらく、エンティティを最適化するために他にできることがあります。アイテム間の独自の関係を管理している場合、多くの責任を DB からアプリにオフロードしていることになりますが、これはすでに多くの作業のように思えます。
アップデート
監査証跡の実装は、Entity Framework ではかなり標準的なプロセスであり、おそらく関係を管理するよりもはるかに簡単です。監査証跡には、基本的にContext_SavingChanges()
メソッドのイベント ハンドラーが含まれ、ObjectStateManager
. このループ内にロジックを追加すると、特定の時間枠内に収まらない追加/更新を無効にしたり拒否したりすることもできます。
監査マネージャーの良い例はCodeProjectにあります。ここでは、作成者が監査情報を保存するだけでなく、ロールバックする方法を示しています。
エンティティ間に主キーと外部キーの関係がない場合、Include メソッドは使用できません。