2013-03-25 60 views
0

我很新的C#和MVC,今天我一直在玩DB4o。我已经把一个练习网站放在一起,通过用户提供的网址来抓取电影。这些电影然后存储在db4o数据库中。但是,我现在似乎正在获取每次启动网站时抛出的Db4objects.Db4o.Ext.DatabaseClosedException
。我有一种感觉,我打了太多的电话给数据库,没有关闭当前连接。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方法只是运行一个查询来从数据库中获取存储的数据。我开始关闭并打开流,只是为了查看是否可以发现问题,但是随后它开始在View of 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> 
     } 
    } 

但是,这可能可能是我的插手。感谢您对这件事的任何帮助。

回答

1

问题似乎是在每次创建后关闭连接。在应用程序运行时,db4o ObjectContainers将保持打开状态。有关更多信息,请参阅this link

如果您还是愿意打开和关闭每次更新后的连接,那么你应该把下面一行方法开始创建()

IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName); 

您正在打开的对象容器一次,但在每次交易后关闭它。

希望这会有所帮助。

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); 
相关问题