2011-08-10 3 views
1

을 배치 한 후 참조 키를로드 3.5 여기엔티티 프레임 워크 - 나는 ASP.Net/웹폼/법인 모델/프레임 워크를 사용하고 엔터티 개체 컨텍스트

양식이> BLL은> DAL은

(개체 모델을 사용) 내 프로젝트의 간단한 구조입니다 여기

내가이

public class MyBLL 
{ 
    public User GetUserByID(int userId) 
    { 
     try 
     { 
      using (MyDAL objMyDAL = new MyDAL()) 
      { 
       return objMyDAL.GetUserByID(userId); 
      } 
     } 
     catch 
     { 
      throw; 
     } 
    } 
} 
처럼 내 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(); 
    } 
} 

입니다

블록을 사용하여 을 통해 DAL을 호출하므로 BLL이 User 개체를 반환 한 직후 MyDAL의 Dispose 이벤트가 실행됩니다. 따라서이 시점에서 ObjectContext 인스턴스가 삭제됩니다. 내 웹 양식에서 이제

, 나는 사용자 테이블에 user_Group 테이블의 외래 키 사용자 정보와 그룹 세부 사항을 얻기 위해이 같은이 함수를 호출하고

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; 
    } 

송시 라인 objUser.User_GroupReference.Load(); I에 온다 이 예외가 발생합니다.

ObjectContext 인스턴스가 삭제되었으며 연결이 필요한 작업의 경우 더 이상 을 사용할 수 없습니다.

해결 방법? 내 DAL의 dispose 메서드에서 db.Dispose();을 수행하지 않으면 정상적으로 작동하며 예외가 발생하지 않습니다. 하지만 db 객체를 거기에 처리하지 않으면 &을 어디에 처리해야합니까? 배치 된 객체 컨텍스트 이후에 참조 키에 액세스하는 방법은 무엇입니까?

답변

2

네비게이션 속성에 액세스 할 때 지연로드가 발생하지만 지연로드는 엔티티를로드하는 데 사용 된 컨텍스트 범위 내에서만 작동하므로 예외가 발생합니다. 컨텍스트를 처리하면 지연로드 기능이 손실됩니다. 컨텍스트 처리 후에 지연로드를 사용할 방법이 없습니다 (엔티티를 새 컨텍스트에 연결하는 것을 제외하고는 삭제하기 전에 원래 컨텍스트에서 분리하는 경우에만 작동합니다).

아키텍처에서는 Include을 사용하여 상위 계층에 필요한 모든 관계를 명시 적으로로드해야합니다. 지연로드를 사용하려는 경우 컨텍스트는 요청의 전체 기간 동안 지속되어야합니다. 웹 양식의 경우 BeginRequestEndRequest 이벤트 처리기에서 처리 할 수 ​​있으며 BeginRequest에 컨텍스트를 만들고 EndRequest에 처리 할 수 ​​있습니다. 컨텍스트는 HttpContext.Items에 저장됩니다. 이 컬렉션에서 컨텍스트를 가져와야합니다. (당신은 도우미 메서드를 만들 수 있습니다) BLL의 생성자에 전달합니다. 그러면 BLL의 생성자가 DAL로 전달됩니다. BLL 또는 DAL에서 HttpContext.Items에 액세스하지 마십시오.

+0

답장을 보내 주셔서 감사합니다. @Ladislav Mrnka – Riz

관련 문제