3

質問:

動的プロキシを処理するときに、それらをシリアル化する必要があるときに、基盤となるPOCOを引き出すことは可能ですか?

理論的根拠:

DbContextEF Code Firstを使用してPOCOエンティティをシリアル化(XML)する必要がありますが、POCOの動的プロキシが作成され、シリアル化が困難であることがすぐにわかりました。

私は以下を試しました:

  1. でプロキシの作成を無効にしDbContext、純粋なPOCOでのみ機能します。これにより、インスタンスを好きなようにシリアル化できます。唯一の欠点は、ナビゲーションプロパティが追跡されていないことです。したがって、保存するときに関連するすべてのエンティティを手動でアタッチする必要があります。そうしないと、新しいエンティティが常に作成されます(コード例を参照)。
  2. ISerializablePOCOにインターフェースを実装して、シリアル化を手動で処理します。これは多くの作業であり、持続可能な解決策ではありません。

コード例。

// Attach and update tags
foreach (var tag in entity.Tags)
{
    Context.Entry(tag).State = Context.Tags.Any(t => t.ID == tag.ID)
                                    ? EntityState.Modified
                                    : EntityState.Added;
}

// Attach and update state.
Context.Entry(entity).State = Context.Resources.Any(x => x.ID == entity.ID)
                                    ? EntityState.Modified
                                    : EntityState.Added;

ご想像のとおり、私のエンティティがより多くの関係を持っていると、複雑さが手に負えなくなる可能性があります。

4

1 に答える 1

4

動的プロキシを処理するときに、それらをシリアル化する必要があるときに、基盤となるPOCOを引き出すことは可能ですか?

基盤となるPOCOがないため、いいえ。プロキシはエンティティインスタンスのラッパーではありません。直接エンティティインスタンスです。

プロキシされたPOCOを使用DataContractSerializerProxyDataContractResolverてシリアル化できますが、プロキシされたエンティティをシリアル化すると、遅延読み込みが有効になっているエンティティをシリアル化しようとしているように聞こえます。これは、読み込みされていないナビゲーションが1つなくなるまで、すべてのプロパティが再帰的に読み込まれるため、予想よりもはるかに多くのシリアル化が可能です。オブジェクトグラフ全体のプロパティ。

DataContractSerializerまた、エンティティをでマークし[DataContract(IsReference = true)]、すべてのシリアル化可能なプロパティをでマークして、循環参照を処理する必要があります[DataMember]

唯一の落とし穴は、ナビゲーションプロパティが追跡されていないことです

プロキシのないエンティティも追跡されます。追跡は、プロキシされているエンティティではなく、アタッチされているエンティティに依存します。

保存する場合は、関連するすべてのエンティティを手動でアタッチする必要があります

デシリアライズされたエンティティを永続化する場合は、常にアタッチする必要があります。

于 2012-09-12T07:58:10.780 に答える