0

我是相当新的 c# 和 MVC,今天我一直在玩 DB4o。我已经建立了一个练习网站,该网站通过用户提供的 url 抓取电影。然后将影片存储在 db4o 数据库中。
但是,我现在似乎每次启动站点时都会抛出Db4objects.Db4o.Ext.DatabaseClosedException 。我有一种感觉,我在没有关闭当前连接的情况下对数据库进行了太多调用。

这是我的控制器,我认为问题源于此。

  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 方法只是运行一个查询来从数据库中获取存储的数据。我开始关闭和打开流,只是想看看是否能发现问题,但随后它开始在 db40 方法的视图中为这段代码抛出相同的异常。

 @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 ObjectContainer 旨在在您的应用程序运行时始终保持打开状态。查看此链接以获取更多信息。

如果您仍然愿意在每次更新后打开和关闭连接,那么您应该将以下行放在方法 Create() 的开头

IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName);

您打开对象容器一次,但在每次事务后关闭它。

希望这可以帮助。

于 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 回答