web-dev-qa-db-ja.com

遅延読み込みなしでエンティティフレームワークオブジェクトをシリアル化する

私は完全にサポートすることが可能であると確信できない非常に特定のシナリオを持っています:

データ管理にEntity Framework 6.3を使用するASP.NETアプリケーションがあります。

また、特定のタイプのデータが表示されたときにログを記録するために使用する汎用監査ライブラリもあります。このライブラリは、ログに記録するデータ/オブジェクトを認識しないように設計されています。エンティティフレームワークで作成されたオブジェクトをjsonシリアル化形式でログに記録したいと思います。

私が遭遇している問題は、仮想参照でEntity Frameworkオブジェクトをシリアル化しようとするときです。シリアル化プロセスは、すべての仮想プロパティの遅延読み込みをトリガーします。

これを防ぐいくつかの解決策があります:

  1. EFコンテキストの遅延読み込みを無効にします。

    public SomeContext(){this.Configuration.LazyLoadingEnabled = false; }

  2. エンティティフレームワークオブジェクトからDTOを作成し、代わりにシリアル化します。

  3. コンテキストから読み取るときに、データを新しいタイプに投影します。

残念ながら、オプション1と3は除外されています。さまざまな理由で、ロガーのニーズを満たすために戻ってコンテキストを変更することはできません。その1つは、変更しているプロジェクトの「所有者」ではないことです。返されるデータ型を変更する場合も同様です。

基本的に、アプリケーションの機能にまったく影響を与えずにログを入力しようとしています。

これでオプション2が残ります。一時的なDTOを作成し、それをログに記録して、それを破棄できます。このアプローチの問題は、ログ参照を追加する人がDTOを作成するためにオブジェクトを理解する必要があることです。 Automapperのようなものを使用してこれを支援できると思いますが、EFオブジェクトを単純にシリアル化できないという事実を回避するだけでも、間違いなく多くの作業が必要になります。

私の質問は、オプション4はありますか?アプリケーションの現在の動作に影響を与えずに、遅延読み込みをトリガーせずにEFオブジェクトをシリアル化する方法はありますか?

おそらく私はEFオブジェクトへの反映を行い、オブジェクトをコピーするか、シリアル化をより直接的に指示することができます。

4

これが私の提案です。

Entityクラスの1つに別の部分クラスを作成します。部分クラスに、必要なフィールドのみをシリアル化するSerialize()メソッドを含め、遅延読み込みされるフィールドを除外します。

これを確実に行う方法がわかったら、残りの各Entityクラスに新しい部分クラスを手動で書き込むか、それらのクラスを生成するT4クラスを作成します。

1
Robert Harvey