3

내 시나리오 :ASP.Net 엔티티 프레임 워크 저장소 및 Linq에

이 C#을

내가 저장소 패턴을 구현 통해 프로그래밍하는 ASP.NET 4.0 웹 응용 프로그램입니다. 내 리포지토리는 모두 ObjectContext을 공유하며 httpContext.Items에 저장됩니다. 각 저장소 내 저장소에서 유형 E.을 Heres의 새로운 ObjectSet 몇 가지 코드를 작성

public class Repository<E> : IRepository<E>, IDisposable 
    where E : class 
{ 
    private DataModelContainer _context = ContextHelper<DataModelContainer>.GetCurrentContext(); 
    private IObjectSet<E> _objectSet; 
    private IObjectSet<E> objectSet 
    { 
     get 
     { 
      if (_objectSet == null) 
      { 
       _objectSet = this._context.CreateObjectSet<E>(); 
      } 
      return _objectSet; 
     } 
    } 

    public IQueryable<E> GetQuery() 
    { 
     return objectSet; 
    } 

내가 COUNTRYS 2 repositorys, 상태 1과 1을 모두에 대한 LINQ 쿼리를 작성하려는 말할 수 있습니다. 엔티티 프레임 워크에서 POCO 클래스를 사용합니다. 주와 국가는이 POCO 수업 중 2 개입니다.

Repository stateRepo = new Repository<State>(); 
Repository countryRepo = new Repository<Country>(); 

IEnumerable<State> states = (from s in _stateRepo.GetQuery() 
          join c in _countryRepo.GetQuery() on s.countryID equals c.countryID 
          select s).ToList(); 
Debug.WriteLine(states.First().Country.country) 

본질적으로 상태 및 관련 국가 엔티티를 검색하고 싶습니다. 쿼리는 상태 데이터 만 반환합니다 ... 그리고 null 인수 예외가 발생합니다 Debug.WriteLine

LazyLoading이 내 .edmx에서 비활성화되었습니다 ... 원하는 방식입니다.

답변

2

아무 것도 검색하지 않고 조인을하고 있습니다. 종속 개체를로드

  • 사용 Include : from s in ((ObjectSet<State>) _stateRepo.GetQuery).Include("Country") 문제에 대한 여러 해결책이 있습니다. 이 방법의 문제점은 전송하지 않으려면 IQueryable 대신 ObjectSet을 직접 표시해야한다는 것입니다.
  • 주어진 상태에 대해 데이터베이스에서 국가를 명시 적으로로드하려면 context.LoadProperty(states.First(), s => s.Country)을 사용하십시오.
  • 쿼리에서 두 엔티티 인 from s in ... join c ... select new { s, c }을 선택하십시오. 상태의 Country 속성에 직접 액세스 할 수는 없지만 익명 유형으로 설정되어 있습니다.
  • 지연 로딩을 사용합니다.
+0

내 ObjectContext에 대해 http://stackoverflow.com/questions/542595/entity-framework-singletonish-objectcontext-good-bad-or-overthinking와 비슷한 작업을하고 있습니다. –

+0

http://www.4guysfromrolla.com/articles/060904-1.aspx에 따르면 HttpContext.Items는 요청별로 작동합니다. 따라서 서로 다른 요청이 객체 컨텍스트와 경쟁 조건을 야기해서는 안됩니다. –

+0

당신은 HttpContext.Items에 맞습니다. 내 대답에서 그 부분을 삭제했습니다. 고마워요. –

1

저장소 구현은 특히 내 ObjectContext를 저장하는 방식과 매우 유사합니다. 그것은 나를 위해 잘 작동하므로 개념적 문제라고 생각하지 않습니다.

정적 인 objectcontext (래퍼 없음)를 사용하여 문제가 해결되는지 확인하십시오. ContextHelper에 컨텍스트가 폐기되고 다시 생성되는 버그가있을 수 있습니다.

+0

새 ObjectContext가 만들어 질 때마다 Debug.WriteLine이 긍정적으로 작동하고 올바르게 작동합니다. 프로젝트에서 지연로드가 활성화되어 있습니까? –

+0

@Chris Klepeis : 예, 그렇습니다. –

+0

응용 프로그램이 n 계층이고 다른 계층이 해당 방식으로 쿼리를 실행할 수 없기 때문에 비활성화했습니다. –