1

オートマッパーで奇妙なことが起こっています。

このコードが InstitutionsImplantations フィールドの値を返す理由が誰か分かりますか?

var result1 = new List<DataModel.Implantations>();
foreach (var c in collection)
{
    DataModel.Implantations i = Mapper.Map<DataModel.Implantations>(c);
    result1.Add(i);
}
var item1 = result1.Where(x => x.Nom == "Valdor").FirstOrDefault();
Console.WriteLine(item1.InstitutionsImplantations);

これは(同じコレクション上で)、 InstitutionsImplants に対して null を返します。

var result2 = Mapper.Map<IEnumerable<DataModel.Implantations>>(collection);
var item2 = result2.Where(x => x.Nom == "Valdor").FirstOrDefault();
Console.WriteLine(item2.InstitutionsImplantations);

事実 : IEnumerable で autommaper によって行われたマッピングは、リスト内の +/- 最初の 300 項目に対して正しく、その後、いくつかの項目コレクションに「不適切に」マッピングされた InstitutionsImplantations プロパティがあります。

InstitutionsImplantations プロパティは、EF 結果からのオブジェクト "プロキシ" です。

なぜこれが起こっているのか分かりますか?

送信してください!

4

1 に答える 1

1

オートマッパーのソースコードを使用して、舞台裏で何が起こっているかを確認して、問題を発見しました。

automapper が IEnumerable コレクションを処理している場合、キャッシュ メカニズムを使用して、コレクションに存在する既にマップされたオブジェクトを再マップする必要がなくなります。

同じオブジェクトを別の結果にマッピングする必要はないと言うでしょう。

しかし、私のシナリオでは、マッピング宣言で AfterMap デリゲートも使用していたことを忘れています。

この AfterMap では、これを行っていました(循環参照の問題を回避するため):

mappedItem.InstitutionsImplantations.Institution.InstitutionsImplantations = null;

この問題は、マッピング (AfterMap デリゲート) の結果にのみ影響を与えているだけで、他には何も影響していないと思いましたが、配置されている「キャッシュ」にも影響を与えているというのは間違っていました。これは私が望んでいたことではありません。この場合、新しいマッピングの代わりに、次のマップされた InstitutionsImplantations オブジェクトに「Null」を使用して、コレクション内の後続のすべてのマッピング コンピューティングにも影響を与えたためです。

私の最初の解決策はクリーンでした。これは、キャッシュ メカニズムが 2 つの「異なる」マッピング間で機能しなかったためです。そして、 automapper 内でこのコレクション キャッシュ メカニズムを無効にする簡単な方法が見つかりませんでした。

于 2013-11-16T10:01:07.833 に答える