2012-08-08 10 views
7

Piszę prostą aplikację w EF 4.1, która będzie używać dodawania, usuwania, edycji i szczegółów z mojego wspólnego źródła danych (serwer centralny dla bazy danych). W mojej klasie Controller napisać:Operacji nie można ukończyć, ponieważ DbContext został usunięty

public class RegController : Controller 
    { 
     // 
     // GET: /Reg/ 
     private string CmdStr = ConfigurationManager.ConnectionStrings["MyConn"].ConnectionString;  
     public ActionResult Index() 
     { 
     using (var db = new RegModelContext(CmdStr)) 
     { 
      return View(db.Registrant); 
     } 

    } 
} 

kiedy jestem wykonanie Moja aplikacja dała mi błąd w widoku indeksu w foreach:

@model IEnumerable<Registration.Models.Register> 

@{ 
    Layout = null; 
} 

<!DOCTYPE html> 

<html> 
<head> 
    <title>Index</title> 
</head> 
<body> 
    <p> 
     @Html.ActionLink("Create New", "Create") 
    </p> 
    <table> 
     <tr> 
      <th></th> 
      <th> 
       UserName 
      </th> 
      <th> 
       Password 
      </th> 
      <th> 
       Email 
      </th> 
      <th> 
       Address 
      </th> 
     </tr> 

    @foreach (var item in Model) { 
     <tr> 
      <td> 
       @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
       @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
       @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
      </td> 
      <td> 
       @item.UserName 
      </td> 
      <td> 
       @item.Password 
      </td> 
      <td> 
       @item.Email 
      </td> 
      <td> 
       @item.Address 
      </td> 
     </tr> 
    } 

    </table> 
</body> 
</html> 

Błąd to: „Operacja nie może być zakończone, ponieważ DbContext został usunięty. "

+7

Musisz zwrócić db.Registrant.ToList(), ponieważ próbuje wykonać zapytanie po usunięciu datacontext, ToList() wymusi wcześniejsze wykonanie. – Giedrius

Odpowiedz

12

Należy użyć listy, aby przekazać jak model

Zakładam, że db.Registrant zwróci listę użytkowników ?, jeśli tak zrobić coś takiego

List<Registrant> items = null; 

using (var db = new RegModelContext(CmdStr)) 
{ 
    items = db.Registrant.ToList(); 
} 

return View(items); 
+0

Tym razem wystąpił błąd w items = db.Registrant.ToList(); That " " Wystąpił błąd podczas wykonywania definicji polecenia. Szczegółowe informacje można znaleźć w wewnętrznym wyjątku. " –

+0

Zmieniłem kod, czy próbowałeś w ten sposób? – JohnnBlade

+3

Dlaczego' od u ... wybierz u', a nie tylko 'db.Registrant.ToList()' – sloth

6

Żeby komentować dalej, musisz oddzielić swoje obawy. Nie powinieneś używać takiego kontekstu bazy danych w kontrolerze. Raczej użyj go poprzez repozytorium lub warstwę usług.

Też miałem ten problem przy użyciu using. Usunąłem część wykorzystującą. Zmodyfikuj poniższy kod, aby dopasować go do scenariusza. Zakładając, że masz przywrócić listę użytkowników. chciałbym mieć to w moim repozytorium Klasa:

public class UserRepository : IUserRepository 
{ 
    MyDbContext dbContext = new MyDbContext(); 

    public IEnumerable<User> GetAll() 
    { 
      return dbContext.Users; 
    } 
} 

Repozytorium następnie wstrzyknięcia w kontrolerze przez Autofac, Ninject itp

w kontroler będzie to wyglądać mniej więcej tak:

public class UserController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public UserController(IUserRepository userRepository) 
    { 
      this.userRepository = userRepository; 
    } 

    public ActionResult Index() 
    { 
      UserViewModel viewModel = new UserViewModel 
      { 
       Users = userRepository.GetAll() 
      }; 
    } 
} 

A następnie w widoku możesz po prostu przeglądać użytkowników.

+4

Prawdopodobnie dlatego, że był zbyteczny w stosunku do faktycznego pytania, prawdopodobnie nie powinien był zostać poddany pod głosowanie, ale jednocześnie nie powinien był zostać przegłosowany z tego samego powodu. musi przestrzegać SoC, szczególnie jeśli jest to bardzo proste –

Powiązane problemy