이것은 좋지 않습니다.
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
}
게으른로드 속성을 따르지 않으려면주의해야합니다. IMO, 정기적으로 필요한 속성 만 포함하는 POCO 개체를 만들어 전체 LINQ 개체가 아닌 세션에 저장하는 것이 좋습니다. – mellamokb
동의. 실제 데이터베이스와 연결되어 있지 않은 응용 프로그램에서 상태를 저장하기위한 사용자 지정 개체가 필요합니다. 당신은 표현 나무와 늦게 평가 된 속성이 당신의 statefulness와 섞이게하고 싶지 않습니다. – David
mellamokb가 말한 것. 누군가가 당신을 쫓아 오기 때문에 그 물건을 업데이트하고 처형되는 문맥에 대한 오류를 얻으 려 시도 할 수도 있기 때문에 나쁜 아이디어라고 생각합니다. POCO 메소드는 데이터를 컨텍스트와 인라인으로 다시 가져와 데이터베이스에서 처리 할 수 있도록 잘 정의되고 검색 가능한 메커니즘을 제공합니다. 따라서 장기적으로 앱에서 악취가 덜 날 것입니다. – Felan