1

項目を EF4.1 コレクションに追加し、それをデータベースに保存してから、そのコレクションを再度選択すると奇妙な結果が生じる特定の理由はありますか?

初期ロードを行うと、コレクション内のすべてのアイテムが typeSystem.Data.Entity.DynamicProxies.MyClassName_LongStringであるため、コレクションに対する次の選択が機能します。

var y = MyCollection.Where(x => x.ValidTo == null).First();

はい、その基準を満たすアイテムが常にコレクション内にあります。いつも。

ただし、コレクションを選択して新しいアイテムを追加し、変更を保存してから、同じコンテキストでコレクションを再度選択すると、コレクションの最後のアイテム (新しいアイテム) は動的プロキシではなく、私のPOCOタイプ(Moo.Model.MyClassName)。

そのバージョンのコレクションで上記と同じ選択を実行すると、null 参照例外がスローされます - 最後のアイテム (非動的プロキシ アイテム) が実際に基準に一致しているにもかかわらず、コレクションを手動で監視して確認しました...

変更後に別のコンテキストからコレクションをロードすると、動作自体が表示されません。それらはすべて動的プロキシであり、選択が機能します。

この動作の原因について何か考えがある人はいますか?

4

1 に答える 1

0

ただし、コレクションを選択して新しいアイテムを追加し、変更を保存してから、同じコンテキストでコレクションを再度選択すると、コレクションの最後のアイテム (新しいアイテム) は動的プロキシではなく、私のPOCOタイプ(Moo.Model.MyClassName)の。

newオペレーターで新しいアイテムを作成した場合、それはプロキシではありません。また、Entity Framework はオブジェクト コンテキストに同じキーがアタッチされたオブジェクトが既に存在するかどうかを確認し、存在する場合は新しい (プロキシされた) オブジェクトを作成しないため、同じコンテキストでクエリを実行してもプロキシにはなりません。 . したがって、新しいエンティティは、プロキシではない同じオブジェクトのままになります。

この方法で作業する場合、実際にはエンティティを最初にプロキシとして作成する必要があります。つまり、new演算子ではなく、次のCreateメソッドを使用しDbSet<T>ます。

var newEntity = dbContext.Entities.Create();

現在、newEntityコレクションに既にある他のエンティティのようなプロキシです。

説明した例外が発生する理由はわかりませんが(同じコレクション内のプロキシオブジェクトと非プロキシオブジェクトの混合に関係している可能性があります)、Create代わりにメソッドを使用すると消えることを願っていますnew.

于 2011-11-25T23:57:59.660 に答える