2009-10-07 2 views
1

나는 저장소 패턴과 SQL에 Linq를 사용하여 상당히 작은 asp.net MVC 애플리케이션을 개발했다. 이제 Entity Framework를 사용하여 동일한 데이터에 액세스하고 업데이트하려고합니다. 그러나 Entity Framework의 테이블 관계에 대한 구문이 올바른지 이해하는 데 문제가 있습니다.Entity Framework - 테이블 관계를 처리하는 방법?

사용자에 대한 데이터 행을 검색 중이며 사용자의 동의 한 비즈니스 (User 테이블에서 외래 키)를 검색하고 싶습니다.

foreach (Business business in user.BusinessReference) 
{ 
    var b = business; 
    ViewData["BusinessName"] = b.BusinessName;      
} 

내가이 권리에 대해 것인가 : 나는 비즈니스 테이블 데이터에 액세스하기 위해이 같은 일을해야 본 적이 예제에서

using (MyDatabaseEntities context = new MyDatabaseEntities()) 
{ 
    User user = db.User.FirstOrDefault(u => u.Users.UserId == userId); 

    if (!user.BusinessReference.IsLoaded) 
    { 
     user.BusinessReference.Load(); 
    } 

    return user; 
} 

: 지금은 이런 일을하고있는 중이 야 방법? 모든 조언을 크게 주시면 감사하겠습니다.

답변

1

ViewData [ "BusinessName"]을 루프를 덮어 쓰고 있기 때문에 실제로 무엇을 하려는지에 대해 말하지 않는 foreach 부분을 제외하고는 어떤 일이 벌어지고 있는지 잘 알고 있습니다.

사용자가 표시되고 일부 BusinessNames를 표시하려는 경우보기에서 사용할 수 있어야합니다. Entity Framework의 지루한 점과 다른 솔루션을 임시로 사용하기로 한 이유는 참조를로드해야하는 것입니다.

제공된 예에서 더 나은 솔루션이 될 수 있습니다

using (MyDatabaseEntities context = new MyDatabaseEntities()) 
{ 
    return (from u in user.Include("Business") 
      where u.UserId == userId 
      select u).FirstOrDefault(); 
} 

불행하게도 당신은 모든 방법을 통해 그 경우에, 쉬운 방법으로 루프 당신의 필요를보다 더 깊은 참조를 미리로드 할 수없고 하중.

+0

그래서 "포함"을 사용하면 여러 테이블이나 관계를 포함 할 수 없습니까? 예 : 사용자 user = db.User.Include ("Business"). 포함 ("UserRoles"). FirstOrDefault (u => u.UserId == userId); – Victor

+0

Include는 Eager를로드하지 않을 수도 있습니다 (Include는 명령이 아닌 "힌트"/ 요청입니다). IsLoaded/Load 코드를 반드시 보관해야합니다. 또한 여러 Include를 스택화할 수 있습니다. –

+0

그래서 Include를 사용하면 컨트롤러에서 다음과 같은 것을 사용할 수 있습니다 : user.Business.BusinessName.ToString(); 내 사용자 개체를로드 한 후 왜 IsLoaded/Load 코드를 사용해야합니까? 이 시나리오의 경우 – Victor

0

아니요, 맞지 않는 것 같습니다. 이것은 그것 같이 더 많은 것 같습니다

User user = db.User.Include("Business").FirstOrDefault(u => u.UserId == userId); 

이는 사용자 엔티티는 비즈니스라는 탐색 속성이 있다고 가정합니다.

+0

정말, 너무 많이 원래의 코드를 수정합니다.기본 생성 된 SQL 쿼리를 검사하는 것이 어느 것이 "더 나은"결과를 얻었는지 결정하는 유일한 방법 일 것입니다. –

0

내가 이런 짓을 했을까 :

  1. 은보기에 대한 프리젠 테이션 모델을 확인하고 강력한 형식의보기로보기를 변경합니다.
  2. L2E를 사용하여 프레젠테이션 모델에 투영합니다. 이처럼

: 여기

var model = (from u in Context.Users 
      where u.UserId == userId 
      select new UserPresentation 
      { 
       UserName = u.Name, 
       BusinessName = u.Business.BusinessName, 
       SomeOtherDatumYourViewNeeds = // ... 
      }).FirstOrDefault(); 

몇 가지 중요한 포인트 :

  • 당신은에 대한 열망로드를 걱정할 필요가 없습니다. 필요한 데이터가 항상로드됩니다.
  • 뷰에 표시하지 않으려는 User 또는 Business 속성과 같이 필요하지 않은 날짜를 SQL Server에 반환하도록 요청하지 않습니다.
  • 이제보기가 엔티티 모델과 분리됩니다. 그들은 둘 다 독립적으로 진화 할 수 있습니다. 원래의 코드가 무슨 짓을했는지에 추가 열망로드를 요청 나는이 생각하지 않습니다
+0

매우 좋은 제안입니다. 나는 이것이 매우 좋은 권고라고 생각하며, 실제로 내가 결국 사용하게 될지도 모른다. u.Business.BusinessName에 액세스하려면 "포함"을 사용해야합니까? – Victor

+0

번호는 투사 할 때 완전히 불필요합니다. –

관련 문제