2012-09-28 1 views
0

나는 오차드 초보자이며 초보자 용 질문이 있습니다.MVC 응용 프로그램을 과수원 CMS로 변환

기존 mvc 응용 프로그램을 오차드로 변환하고 있으며 실제 연습을 위해 contoso 대학의 샘플 MVC 응용 프로그램을 오차드로 변환하여 기본 사항을 배우려고합니다.

나는 모듈을 만들어서 메뉴 요소를 추가하여 응용 프로그램에 액세스하고 Home \ Index 액션의 출력을 표시 할 수있어서 모듈이 올바르게 설정되었음을 알 수 있습니다. .

이제 데이터베이스 쿼리에서 생성 된 테이블을 표시하는 Home \ About 작업을 추가하려고합니다.

MSDTC on server 'DEV\SQLEXPRESS' is unavailable. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: MSDTC on server 'DEV\SQLEXPRESS' is unavailable.

Source Error:

Line 17: Line 18: Line 19: @foreach (var item in Model) { Line 20: Line 21:

Source File: c:\Users\dev1\Documents\My Web Sites\Orchard CMS\Modules\ContosoUniversity\Views\Home\About.cshtml Line: 19

Source File: c:\Users\dev1\Documents\My Web Sites\Orchard CMS\Modules\ContosoUniversity\Views\Home\About.cshtml Line: 19

지금, 일부 인터넷 검색 후, 나는이 주변 거래를 억제의 필요성과 함께 할 수있는 뭔가가 이해 :

나에게 다음과 같은 오류를 제공합니다.

public class HomeController : Controller 
    { 
     private SchoolContext db = new SchoolContext(); 
    [Themed] 
     public ActionResult Index() 
     { 
      ViewBag.Message = "Welcome to Contoso University!"; 
      return View(); 
     } 
    [Themed] 
     public ActionResult About() 
     { 
      using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) 

      { 
       var query = "SELECT EnrollmentDate, COUNT(*) AS StudentCount " 
        + "FROM Person " 
        + "WHERE EnrollmentDate IS NOT NULL " 
        + "GROUP BY EnrollmentDate"; 
       var data = db.Database.SqlQuery(query); 
       return View(data); 
      } 
     } 

하지만, 도움이되지 않습니다 그래서 (TransactionScope에 범위 = 새 TransactionScope에 (TransactionScopeOption.Suppress)) 내 집 컨트롤러에를 사용하여 를 추가합니다. 에 다른 장소를 읽었습니다. 데이터 액세스 코드을 이것으로 둘러 쌉니다.하지만 엔티티 프레임 워크를 사용하고 있기 때문에 명시 적으로 데이터 연결이 열려 있지 않으므로 사용 문을 어디에 둘 것인지 확실하지 않습니다.

답변

0

Bertrand Le Roy와 Giscard Biamby에게 저를 올바른 방향으로 밀어 주신 것에 감사드립니다.

저는 컨트롤러에서 ToList를 추가하여 쿼리 실행을 강제하는 것이 합리적이라고 Bertrand는 동의하지만 그만큼 도움이되지 않습니다. 내가 한 것은이 같은보기에서 억제 조항을 추가했다 :

<table> 
    <tr> 
    <th> 
     Enrollment Date 
    </th> 
    <th> 
     Students 
    </th> 
    </tr> 
    @using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) 
    { 
    foreach (var item in Model) 
    { 
    <tr> 
     <td> 
     @String.Format("{0:d}", item.EnrollmentDate) 
     </td> 
     <td> 
     @item.StudentCount 
     </td> 
    </tr> 
    } 
    } 
</table> 

나는 또한 뷰의 상단 부분에 사용하여 문을 추가했다 :

@model IEnumerable<ContosoUniversity.ViewModels.EnrollmentDateGroup> 
@using System.Transactions 

그리고 마지막으로, 참조를 사용하도록 허용하려면 Web에 System.Transactions 어셈블리를 추가해야했습니다.config :

<system.web> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
     <add assembly ="System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 

     </assemblies> 
    </compilation> 

이제 오류는 발생하지 않지만 데이터가 하나도 없지만 다른 문제입니다. 나는 이것이 올바른 방향으로의 한 걸음이라고 확신한다. 내가 거기에 내 모든보기를 변경하는 것을 방지하기 위해 높은 수준에서 할 수있는 방법이 될 것이다, 그러나 적어도 나는 그것이 작동되도록 할 수 있습니다 할 것

.

+0

왜 별도의 대답을 붙여 않았고 내 대답에 코멘트를 추가하는 대신 받아 들일? System.Data보다는 System.Transactions 어셈블리를 추가해야한다는 점을 제외하고는 말한 것과 거의 같습니다. –

+2

어쨌든 명성 포인트에 대해 무엇입니까 ??? 나는 당신의 대답에 대해 신용을 얻으려고하지 않았습니다. 이것은 당신의 대답의 본질이며, 나는 당신에게 그것을위한 신용을주었습니다. 어쨌든 귀하의 답변이 잘못된 어셈블리를 참조했으며 뷰에서 using 문도 생략했습니다. 별로 중요하지 않은 것은 작업 코드를 작성하는 데 약간의 시간이 필요하다는 것입니다. 나는 프로그래밍 문제에 대한 답을 찾을 때 항상 유용 완전하고 정확한 코드 섹션을보고 찾아, 따라서 나는 사용자 친화적 인 방법으로 그 과정에서 배운했던 모든 것을 요약하고 싶었다. – TMan

+0

주석은 코드 샘플에 좋지 않다고 생각합니다. 나는 누가 브라 우니 포인트를 얻는지는 덜 신경 쓸 수는 없지만, 공정하기 위해서, 당신은 올바른 길로 나를 인도 한 사람이었습니다. 나는 또한 대답에서 언급했습니다. 그래서 왜 네가 그렇게 불쾌 해 보이는지 모르겠다. – TMan

0

db.Database.SqlQuery()은 어떤 유형입니까? 보기 및보기에서 사용하는 모델에 대한 코드를 포함 할 수 있습니까?

이 오류 메시지는 데이터 액세스가 면도기보기에서 발생하는 것 같습니다. 이 경우 foreach (var item in Model) { ...}using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress)) {...} 블록으로 감싸서 문제를 해결할 수 있습니다.

거기에서 TransactionScope가 작동하려면 적절한 네임 스페이스를 면도기 뷰로 가져와야 할 수도 있습니다. 제대로 기억한다면 Orchard.Web \ web.config의 <system.web> <compilation> <assemblies> 블록 안에 <add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />을 추가해야했습니다.

1

여기서 문제는 실제 쿼리 실행이 지연되고 실제로 트랜잭션 범위 블록 내에서 발생하지 않는다고 생각합니다. SQL 쿼리에서 ToList()를 호출하면 해결할 수 있습니다. 실제로 쿼리를 뷰에서 수행하지 않으려는 것도 좋은 방법입니다. 현재보기로 보내는 것은 데이터가 아니며 쿼리입니다.

관련 문제