2012-04-09 2 views
3

전체 개체를 세션에 저장하는 것에 대한 의견을 보내고 싶습니까? 예를 들어, 고객 오브젝트. 고객이 세션에 저장된 ID로 필요할 때마다 데이터를 다시 페치하지 않고 제어판에 로그인하면 전체 고객 개체를 세션에 저장하는 것에 대한 장단점은 무엇입니까?전체 LINQ 개체를 세션에 저장하는 것에 대한 생각?

Customer c = (Customer)Session["objCustomer"]; 

물론, 당신은 확인하고 세션을 새로 고치는 기능을 가지고해야합니다 :

그래서 언제든지 당신은 다만 수, 고객 개체를 참조 할 필요가 있었다. 널 (null) 세션의 경우 또는 갱신이 이루어진 후에이 함수를 실행해야합니다.

이외에도이 방법으로 알고 있어야하는 다른 문제가 있습니까? 이것은 프로그래밍만큼 훨씬 더 좋을 것이고 데이터베이스에 대한 호출도 훨씬 적을 것입니다. 누구를 생각해?

+7

게으른로드 속성을 따르지 않으려면주의해야합니다. IMO, 정기적으로 필요한 속성 만 포함하는 POCO 개체를 만들어 전체 LINQ 개체가 아닌 세션에 저장하는 것이 좋습니다. – mellamokb

+2

동의. 실제 데이터베이스와 연결되어 있지 않은 응용 프로그램에서 상태를 저장하기위한 사용자 지정 개체가 필요합니다. 당신은 표현 나무와 늦게 평가 된 속성이 당신의 statefulness와 섞이게하고 싶지 않습니다. – David

+0

mellamokb가 말한 것. 누군가가 당신을 쫓아 오기 때문에 그 물건을 업데이트하고 처형되는 문맥에 대한 오류를 얻으 려 시도 할 수도 있기 때문에 나쁜 아이디어라고 생각합니다. POCO 메소드는 데이터를 컨텍스트와 인라인으로 다시 가져와 데이터베이스에서 처리 할 수 ​​있도록 잘 정의되고 검색 가능한 메커니즘을 제공합니다. 따라서 장기적으로 앱에서 악취가 덜 날 것입니다. – Felan

답변

7

이것은 좋지 않습니다.

ORMappers가 작동하는 주된 이유는 서로 다른 컨텍스트의 개체를 혼합 할 때 ORMappers가 작동하지 않기 때문입니다. 그리고 이것은 당신이 제안하는 시나리오에서 일어날 것입니다 - 당신은 다음 (그리고 다음) 요청들이 사용하는 다른 문맥에 의해 생성 된 세션에 객체를 가지고 있습니다. Sonner 또는 나중에 당신은 예외를 얻기 시작할 것입니다.

개인적으로 나는 고객 ID (및 기타 속성)를 포함하는 간단한 개체가 세션 (또는 양식 쿠키의 사용자 지정 데이터 섹션)에 저장되고 고객 개체에 대한 액세스를

(생산 코드를보다 수비로 여기 저기 몇 가지 검사를 필요) : 다음 Items 컨테이너를 포함하는 간단한 성명

const string CUSTOMERITEM = "customeritem"; 
public Customer Current 
{ 
    get 
    { 
     if (HttpContext.Current.Items[CUSTOMERITEM] == null) 
     { 
      int id = retrieve_the_id; 

      using (DbContext ctx = GetCurrentDbContext()) 
      { 
       HttpContext.Current.Items.Add(CUSTOMERITEM, ctx.Customers.FirstOrDefault(c => c.ID == id); 
      } 
     } 
     return (Customer)HttpContext.Current.Items[CUSTOMERITEM]; 
    } 
} 

항목 컨테이너가 하나 개의 요청 만 시간 동안 지속됩니다. 위의 스 니펫은 요청 당 객체가 한 번만로드되도록합니다.

당연히 요청 당 하나의 추가 쿼리가 당신의 접근 방식에 비해 가격이 붙습니다. 그러나 이점은 데이터베이스 컨텍스트를 엉망으로 만들지 않는다는 것입니다.

Customer 객체를 필요로하지 않습니다하지만 당신이 직접 고객의 ID를 전달하고 쿼리에서 사용할 수있는 몇 가지 비즈니스 프로세스가하는 것으로 :

public IEnumerable<Order> CustomerOrders(int CustomerID) 
{ 
    // use the customer id directly, without first loading the customer object 
} 
2

내가 다른에서 Wiktor에 의해 설명 된 문제로 실행 한 대답. NHibernate를 사용하고 세션에 객체를 저장하면 세션을 비교하는 데 문제가 발생하거나 연결이 끊어진 세션과 관련된 문제가 발생합니다. 그럼에도 불구하고 세션에 객체를 저장합니다. 난 그냥 그들이 모두 자신의 Equals() 및 GetHashCode() 함수를 구현하는지 확인합니다. 그런 식으로 다른 세션의 개체를 비교하여 개체가 같은 개체인지 확인할 수 있습니다. 나는 obj1 == obj2 대신에 obj1.Equals(obj2)을 사용하는 버릇이됩니다.

물론, 항상 트레이드 오프가 있습니다. 코드를 복잡하게 만드는 대신 쿼리를 반복하지 않아도되는 속도를 얻을 수 있습니다. 귀하에게 맞는 방법은 귀하의 상황에 따라 다릅니다.

0

mellamokb 나는 필요한 물건을 가져 오는 데 동의합니다. 모델을 조정하여이 작업을 수행 할 수 있으며 지연로드를 끌 수도 있습니다. 그것 이외에 나는 그것이 꽤 안전하다라고 생각한다.이러한 모든 객체를 참조로 저장하지 않는 한, 세션에 배치 된 객체는 자체적으로 문제가 없습니다. 문제가 발생할 수있는 유일한 경우는 두 컨텍스트가 모두 범위 내에있는 경우입니다.

관련 문제