2011-04-14 3 views
2

Entity에서 DataContext를 사용할 수있는 방법을 찾으려고합니다. Entity 인스턴스가 검색된 후 DataContext를 설정하는 중

partial public class MyEntity 

    public DataContext as MyDataContext 

    private sub OnLoaded() 
     Me.DataContext = <the context that retrieved this instance> 
    end sub 

end class 

첫째,이 같은이

을 수행 할 수 있습니다

나는 이런 일을하고 싶지? 둘째,이 엔티티를 다른 DataContext와 함께 사용하지 않는다고 가정하면, 그런 일을하는 데있어서 위험이나 문제가 있습니까?

partial public class MyDataContext 

    public function GetMyEntity(byval id as integer) as MyEntity 
     dim o = MyEntities.SingleOrDefault(function(e) e.id = id) 
     if o isnot nothing then o.DataContext = Me 
     return o 
    end function 

end class 
+1

왜 필요한가요? 왜 각 엔티티에 대해 datacontext가 필요한가요? – jaraics

+0

일반적으로 이것은 불필요한 것으로 보이며 원하는 작업을 수행하는 데 더 좋은 방법이있을 수 있습니다. 시나리오에 대한 자세한 설명을 제공하면 도움이됩니다. 이 시스템을 어떻게 사용할 것인지에 따라 잡담이있을 수 있습니다. 내가 볼 수있는 한 웹 앱 (주석에'HttpContext '참조)이있다. 마음에 떠오르는 한 가지 사항은 요청 당 또는 짧은 컨텍스트 수명을 사용하지만 엔티티를 캐시에 저장하고 나중에 검색하여 사용하려고하는 경우입니다. 그러면 첫 번째 문제가 발생합니다. 시나리오를 설명하면 더 많은 것을 생각해 볼 수 있습니다. – Yakimych

+0

아무 것도 캐시하려고하지 않습니다. 나는 그 질문에서 내가하려고하는 것을 정확히 말하고있다. 간단히 엔티티 인스턴스 내에서 참조를 검색 한 데이터 컨텍스트로 참조하기를 원할뿐입니다. 다른 의견에서 언급했듯이 데이터 컨텍스트의 수명은 웹 요청보다 길지 않습니다. –

답변

1

당신은 DataContext에에 싱글 톤 패턴을 사용할 수 있지만 그것을 유지하는 것이 아니므로 당신은 그것을 수명 관리의 일종이 필요합니다

는 방법 나는 현재 그것을 할 것입니다 주위에 오래. (요청은 아마도 처리가 끝납니다)

C#의 예제이지만 이해해 주시면 감사하겠습니다.

public class MyDataContext 
{  
    public static MyDataContext Current 
    { 
     get 
     { 
      MyDataContext context = (MyDataContext)HttpContext.Current.Items["Context"]; 
      if(context == null) 
      { 
       context = new MyDataContext(); 
       HttpContext.Current.Items["Context"] = context; 
      } 
      return context; 
     } 
    } 
} 

public class MyEntity 
{ 
    public MyDataContext DataContext 
    { 
     get{ return MyDataContext.Current;} 
    } 
} 

의 Global.asax에서 당신은 이벤트 Application_EndRequest를 연결하고 그것을 할 수있는 GC를 기다리는 대신 수동으로 상황을 처리하는 MyDataContext.Current.Dispose();를 호출 할 수 있습니다. 당신이 그것을위한 진짜 이유, 단지 a sidenote from MSDN 지정하지 않았지만

+0

나는 그것을 HttpContext에 넣는 것에 대해 생각하지 않았다. 그 수명은 뭐지? 요청이나 세션에 액세스하는 것 이외에는 사용하지 않았습니다. –

+0

요청이 끝나면 끝납니다. 그래서 매우 짧습니다 – Magnus

+0

모든 엔티티가 상속 할 기본 엔티티 클래스를 가질 방법이 있습니까? –

2

: 일반적으로

을하는 DataContext 인스턴스가 하나의 " 작업 단위"지속하도록 설계 입니다 그러나 응용 프로그램이 를 정의 기간. A DataContext은 가벼우 며 이며 만들기에는 비용이 들지 않습니다. 일반적인 LINQ to SQL 응용 프로그램은 메서드 범위에 인스턴스를 만들거나 이 관련된 데이터베이스 집합의 논리적 집합을 나타내는 수명이 짧은 클래스의 멤버로 데이터베이스 작업을 만듭니다.

more :

DataContext의 인스턴스를 재사용하지 마십시오. 각 DataContext 은 특정 편집/쿼리 세션에 대한 상태 (ID : 캐시 포함)를 유지합니다. 데이터베이스의 현재 상태에 따라 이라는 새 인스턴스를 얻으려면 새 DataContext을 사용하십시오.

그리고 마지막으로 ... 모든 인스턴스 멤버는 스레드로부터 안전하지 않을 있습니다.

그러나 일부 경우에는 반영구적 인 해결책이 매우 유용 할 수 있습니다. Rick Strachl의 기사 (Linq to SQL DataContext Lifetime Management)를 살펴보십시오. DataContext의 다양한 접근 방식이 검토되고 있습니다. On of them - 비즈니스 객체 당 DataContext을 생성하는 것이 정확히 필요한 것입니다.

+0

데이터 컨텍스트의 사용은 매우 짧습니다. 일반적으로 웹 요청의 수명 만. 나는 언제나 새로운 인스턴스를 생성 할 수 있지만 모든 객체 (ID 캐시로 인해)에서 동일한 컨텍스트에 액세스해야합니다. –

관련 문제