2

つまり、基本的に、生成されたプロパティをプライベートにし、生成されたプロパティをロードするかどうかを処理するパブリックプロパティを作成することで、遅延ロードに対する半自家栽培のソリューションを考え出しました。

 public ChatRoom ParentRoom
 {
   get
   {
     if(!ParentRoomInnerReference.IsLoaded)
     {
        ParentRoomInnerReference.Load();
     }

     return ParentRoomInner;
   }   

   set
   {
     ParentRoomInner = value;  
   }
 }

これで、次のようなクラスのクエリでうまく機能します(生成されたクラスの部分的なクラス拡張にすべての「クエリ」があるため)。

 context.Items.Where(ParentRoomInner.Id = someId).ToList();

このメソッドはItemクラス内にあるため、実行できない場合でも問題なく実行できます。

 context.Items.Where(ParentRoom.Id = someId).ToList();

エンティティフレームワークは、式を生成するためにそのプロキシプロパティが何であるかを理解できないためです。これは本当に問題になります。たとえば、部屋のすべての投稿(アイテム)の数を取得しようとしているので、Roomクラスでそのメソッドが必要です。

 public Int32 GetPostCount()
 {
    return EntityContext.Context
           .ChatItems
           .Count(item => item.ParentRoom.ChatRoomID == ChatRoomID); //Boom
 }

Itemクラス内で同じ理由で、Itemクラス内でParentRoom(プロキシ)プロパティを使用できないため、Roomクラスのこのクエリでは使用できません。エンティティフレームワークは、そのプロパティを理解できません。

ここで質問は、ParentRoomプロパティをタグ付けして、それがParentRoomInnerプロパティを参照していることを認識し、式を分解するときにそれを処理する方法を認識できるような属性があるかどうかです。

私が考えることができる他の唯一の選択肢は、生成されたプロパティを内部にし、RoomクラスクエリでParentRoomInnerプロパティ(meh)を使用するか、GetPostCountメソッドなどのメソッドをItemクラスに移動し、RoomクラスポイントでGetPostCountメソッドを使用することです。それに。(ひどいことでもありませんが、メソッドを2倍にするだけです)

4

1 に答える 1