2011-08-10 5 views
1

を配置した後、リファレンスキーをロード3.5ここEntity Frameworkは - 私はASP.Net/Webフォーム/エンティティモデル/フレームワークを使用していますエンティティオブジェクトのコンテキスト

フォームは> BLLは> DALは

(エンティティモデルを使用しています)私のプロジェクトのシンプルな構造であり、ここで

は私のDALのスニペット

public class MyDAL : IDisposable 
{ 
    private MyEntities db; 
    public BaseDAL() 
    { 
     db = new MyEntities(); 
    } 

    public User GetUserByID(int userId) 
    { 
     try 
     { 
      IQueryable<User> objUser = null; 
      objUser = from res in db.Users 
          where res.UserId == userId 
          select res; 

      return objUser.FirstOrDefault(); 
     } 
     catch 
     { 
      throw; 
     } 
    } 

    public void Dispose() 
    { 
     db.Dispose(); 
    } 
} 

である私は、この

public class MyBLL 
{ 
    public User GetUserByID(int userId) 
    { 
     try 
     { 
      using (MyDAL objMyDAL = new MyDAL()) 
      { 
       return objMyDAL.GetUserByID(userId); 
      } 
     } 
     catch 
     { 
      throw; 
     } 
    } 
} 
のように私のBLLからDALの機能を呼び出します

ブロックを使用してDALをと呼びます。したがって、BLLがUserオブジェクトを返すとすぐにMyDALのDisposeイベントが発生します。この時点でObjectContextインスタンスは破棄されます。 ODEは私がラインobjUser.User_GroupReference.Load();になると

は今私のWebフォームでは、私が

Userテーブルに
protected void Page_Load(object sender, EventArgs e) 
    { 
     MyBLL objMyBll = new MyBLL(); 

     User objUser = objMyBll.GetUserByID(123); 
     objUser.User_GroupReference.Load(); // ERROR LINE 
     int groupId = objUser.User_Group.Group_Id; 
    } 

をUSER_GROUP表の外部キーであるユーザー情報とグループの詳細を取得するには、このように、この関数を呼び出していますこの例外が発生する

ObjectContextインスタンスが破棄され、接続が必要な操作の場合は、 を使用できなくなりました。

解決方法DALのdisposeメソッドでdb.Dispose();を実行しないと、正常に動作し、例外が発生しません。しかし、dbオブジェクトをそこに配置しないと、&はどこに配置すればいいですか? オブジェクトコンテキストを破棄した後に参照キーにアクセスする方法は?

答えて

2

ナビゲーションプロパティにアクセスすると遅延ロードが発生するが、遅延読み込みはエンティティのロードに使用されるコンテキストの範囲内でのみ機能するため、例外が発生します。コンテキストを破棄すると、遅延読み込み能力が失われます。コンテキスト廃棄後に遅延読み込みを使用する方法はありません(エンティティを新しいコンテキストにアタッチする場合を除きますが、ディスパッチする前に元のコンテキストからデタッチする場合にのみ機能します)。

アーキテクチャでは、Includeを使用して、上位レイヤに必要なすべてのリレーションを明示的にロードする必要があります。遅延ロードを使用する場合は、要求の全期間にわたってコンテキストを存続させる必要があります。 Webフォームの場合、BeginRequestEndRequestのイベントハンドラで処理することができます。BeginRequestにコンテキストを作成し、EndRequestに配置します。コンテキストはHttpContext.Itemsに格納されます。このコレクションからコンテキストを取得する必要があります(そのためのヘルパーメソッドを作成することができます)、それをBLLのコンストラクタに渡します.BLLのコンストラクタはDALに渡します。 BLLまたはDALからHttpContext.Itemsにアクセスしないでください。

+0

返信いただきありがとうございます@ラディスラフMrnka – Riz

関連する問題