9

私は共通のデータ ソース (データベースの中央サーバー) から追加、削除、編集、および詳細を使用する EF 4.1 で単純なアプリケーションを作成しています。私のコントローラークラスでは、次のように書きます。

    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);
       }

    }
}

アプリケーションを実行すると、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>

エラーは次のとおりです。「DbContext が破棄されたため、操作を完了できません。」

4

2 に答える 2

15

モデルとして渡すにはリストを使用する必要があります

db.Registrantがユーザーのリストを返すと思いますか?もしそうなら、このようなことをしてください

List<Registrant> items = null;

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

return View(items);
于 2012-08-08T07:15:52.590 に答える
6

さらにコメントするには、懸念事項を分離する必要があります。コントローラーでそのようなデータベース コンテキストを使用しないでください。むしろ、リポジトリまたはサービス層を介して使用してください。

を使用するときにもこの問題が発生しusingました。使用部分を取り外しました。シナリオに合わせて以下のコードを変更します。ユーザーのリストを戻すと仮定します。これをリポジトリクラスに入れます:

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

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

このリポジトリは、Autofac、Ninject などによってコントローラーに注入されます。

コントローラーでは、次のようになります。

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()
          };
     }
}

そして、あなたのビューでは、ユーザーをループすることができます。

于 2012-08-08T09:45:28.023 に答える