0

私はかなり新しいc#とMVCであり、今日はDB4oで遊んでいます。ユーザーから提供されたURLを介して映画をスクレイプする練習サイトをまとめました。その後、フィルムはdb4oデータベースに保存されます。ただし、サイトを起動するたびにDb4objects.Db4o.Ext.DatabaseClosedExceptionが
スローされるようになりました。現在の接続を閉じずに、DBを何度も呼び出しているように感じます。

これが私のコントローラーです。これが問題の原因だと思います。

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Web.Mvc;
  using MvcMovieDatabase.Models;
  using Db4objects.Db4o;
  using Db4objects.Db4o.Linq;


  using System.IO;namespace MvcMovieDatabase.Controllers
  {
      public class HomeController : Controller
      {
           static string YapFileName = Path.Combine(      
           Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                           "moviesDB.yap");

    IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName);

    public ActionResult Index()
    {
        ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";

        return View();
    }

    public ActionResult About()
    {
        ViewBag.Message = "Your app description page.";

        return View();
    }

    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }

    [HttpGet]
    public ActionResult Create()
    {
        return View();
    }

    [HttpPost]
    public ActionResult Create(string movieURL)
    {
        Movie newMovie = new Movie();
        MovieDirectory dir = new MovieDirectory();

        newMovie = dir.GetMovieData(movieURL);

        db4o.Store(newMovie);

        db4o.Close();

        return RedirectToAction("Index");
    }

    public ActionResult DB4o()
    {

        IEnumerable<Movie> allFilms = from movie in db4o.Query<Movie>()
                                      select movie;

        db4o.Close();

        return View(allFilms);
    }


   }
 }

createメソッドは文字列を受け取り、データを取得するために必要なコードを実行します。db4oメソッドは、クエリを実行して、データベースから保存されたデータを取得します。問題を見つけることができるかどうかを確認するために、ストリームを閉じて開き始めましたが、その後、Viewofdb40メソッド内のこのコードに対して同じ例外がスローされ始めました。

 @model IEnumerable<MvcMovieDatabase.Models.Movie>

 @{
      ViewBag.Title = "DB4o";
  }

  <h2>DB4o</h2>

  @foreach (var item in Model)
  {
      foreach (var cast in item.MovieCastList)
      {
          <p><img src="@cast.CastImage" /></p>
          <p>@cast.CastRealName | <span>@cast.CastFilmName</span></p>
      }
  }

しかし、これはおそらく私の干渉によるものかもしれません。この問題について助けてくれてありがとう。

4

2 に答える 2

1

問題は、作成するたびに接続を閉じていることのようです。db4o ObjectContainersは、アプリケーションの実行中は常に開いたままにすることを目的としています。詳細については、このリンクを参照してください。

更新のたびに接続を開いたり閉じたりする場合は、Create()メソッドの先頭に次の行を配置する必要があります。

IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName);

オブジェクトコンテナを1回開きますが、トランザクションごとに閉じます。

お役に立てれば。

于 2013-03-26T17:18:51.680 に答える
0

Gonzaloが説明したように、アプリケーションでdb4oセッションを閉じてはなりません。分離されたトランザクションを使用する場合は、次のように使用しますOpenSession

IEnumerable allFilms = null;
using (var session = db4o.Ext().OpenSession())
{
    // query
    allFilms = from movie in session.Query()
               select movie;

    // do object activation here or rely on default activation level
    foreach (var movie in allFilms)
    {
        session.Activate(movie, int.MaxValue);
    }
}

return View(allFilms);
于 2013-03-29T19:03:55.860 に答える