2010-08-07 1 views
0

MVC/LINQ 전체에 대해 여전히 매우 새로운 기능입니다. 나는 블로그를 만드는 과정을 밟고 있으며 게시물을위한 테이블을 만들고 각 게시물 내에 해당 게시물의 설명을위한 테이블을 작성해야합니다. 이 같은 일을, 각각의 코멘트 테이블 불행하게도ASP.NET MVC/LINQ - 테이블 및 연결 수 검색

postsTable = (new DataContext(connectionString)).GetTable<Post>(); 

:

내가 좋아하는 일을하고있어, 테이블을 구축합니다. DataContext(connectionString)을보고 매번 다시 연결한다고 가정합니다. 가져 오기를 시작할 때 한 번 연결 한 다음 연결이 끝나면 연결을 닫을 수 있어야합니다. 내가 잘못 했니? http://www.asp.net/MVC

+0

왜 게시물에 대한 표를 원하고 각 블로그 포스트의 의견에 대해 별도의 표를 원하십니까? 당신은 하나의 테이블에 모든 주석을 저장할 수 있습니다. 그렇게 생각하면 훨씬 쉬울 것입니다. – Alxandr

+0

또한, 아마도 다른 곳에서 컨텍스트를 정의하는 것이 좋습니다. 그런 다음 다시 사용할 필요없이 바로 사용할 수 있습니다.예를 들어 컨트롤러의 생성자에서 DataContext를 만들어 클래스 전역 변수 (예를 들어 db라고 함)에 넣은 다음 "loadPosts"(또는 이름이 뭐든간에) 그냥 db.GetTable을 호출 할 수 있습니다. ()'. – Alxandr

답변

-1

"는 요청에 따라 세션/컨텍스트"라는 패턴이다. 가장 인기 있고 교차하는 ORM, 이것을 수행하는 교차 WebForms/MVC 방법은 컨텍스트를 새로 작성하고 세션에 던져 넣고 마지막으로 끝까지 끌어 내려 처리합니다.

에서 : http://blogs.microsoft.co.il/blogs/gilf/archive/2010/05/18/how-to-manage-objectcontext-per-request-in-asp-net.aspx

public static class ContextHelper<T> where T : ObjectContext, new() 
{ 
    #region Consts 

    private const string ObjectContextKey = "ObjectContext"; 

    #endregion 

    #region Methods 

    public static T GetCurrentContext() 
    { 
    HttpContext httpContext = HttpContext.Current; 
    if (httpContext != null) 
    { 
     string contextTypeKey = ObjectContextKey + typeof(T).Name; 
     if (httpContext.Items[contextTypeKey] == null) 
     { 
     httpContext.Items.Add(contextTypeKey, new T()); 
     } 
     return httpContext.Items[contextTypeKey] as T; 
    } 
    throw new ApplicationException("There is no Http Context available"); 
    } 

    #endregion 
} 

할 수 있습니다 여기에서 볼 수 있듯이) (새 컨트롤러의 생성자에서의 DataContext를 보내고과 주위도 엉망 : http://www.stephenwalther.com/blog/archive/2008/08/20/asp-net-mvc-tip-34-dispose-of-your-datacontext-or-don-t.aspx

지금이 글이 가지고 있지 않은 말한다 당신의 맥락을 처분하는 것에 대해 걱정할 필요가 있지만 동의하지 않습니다. 최신 ORM을 사용하면 변경 사항을 추적하고 유지하는 것과 같은 "세션"을 실제로 활용하고자합니다. 컨텍스트를 수동으로 처리하지 않으면 모든 종류의 불량 코드 또는 끔찍한 작업 단위 패턴이 예외와 같이 예외를 throw하지 않습니다. IMHO는 ORM의 세션 측면이 가장 중요한 부분입니다. 위험을 무릅 쓰고 무시하십시오.

SQL Server를 사용하는 경우 연결 풀링 기능을 사용하면 연결을 열고 닫을 때 많은 성능 영향이 무시됩니다. 1 초에 10 만 건의 요청을 시작하지 않는다면 걱정하지 않을 것입니다.

+0

linq에서 SQL 추적 변경 사항으로 인해 성능상의 이유로 1 요청이 항상 1 datacontext 인스턴스화/세션에 매핑되는 것은 아닙니다. 반드시 웹 요청에 따라 작업 패러다임의 단위를 고수하십시오. Ado.net 연결 풀링은 더 낮은 수준에서 db 채널을 최적화합니다. – Tahbaza

+0

@ Tahbaza, 귀하의 권리 인 아직 요청 당 세션/컨텍스트는 여전히 매우 인기있는 패턴으로 남아 있습니다. 99 %의 시간은 한 번 요청에 잘 맞습니다. 나는 당신이 나의 완전한 대답을 읽지 않았 음을 보여주기 때문에 나는 당신의 코멘트의 마지막 문장을 좋아한다. – jfar

-1

이동하고 LINQ은 당신이 할 수있는 SQL로하고있는 때문에 당신이

-1

찾고있는 무엇을 보여줍니다 좋은 기사의 전체 무리 거기 자습서 및 스타터 키트를 체크 아웃 ...

  1. 적절한 외래 키 관계로 데이터베이스에 블로그 및 설명 테이블을 정의하십시오.
  2. dbml 디자이너 화면에 끌어다 놓기. 저장 버튼을 클릭하십시오. 그 때 코드가 생성됩니다.
  3. viewmodel을 채울 때 (또는 컨트롤러 동작 결과로 데이터를 가져 오는 경우)에는 필요한 정보 만 쿼리합니다. ithe LINQ 쿼리과 같이 보일 수 있습니다 관련 의견 블로그 항목의 단일 뷰를 들어

... 당신이 찾고있는 무엇

YourDataContext dataContext = new YourDataContext(); 
    var blogData = (from b in dataContext.Blogs 
     where b.BlogId == 1 
     select b).SingleOrDefault(); 

// you should now have a single blog instance with a property named Comments. Set the 
// fetch mode to eager if you plan to always show the comments; leave it lazy to only do 
// the lookup if necessary. Execute all of your queries/accesses before you pass 
// data to the view 
+0

와우, 처분 안해? 모든 세션/작업 단위 기반 ORM에 해롭고 나쁜 습관이 있습니다. – jfar

+0

@jfar 여기에 완벽한 제작 모듈을 쓰지 않고 코드 스 니펫 만 제공합니다. 사용 또는 명시 적 처분의 적절한 사용은 코드 컨텍스트에 더 의존합니다. – Tahbaza