C# 正在引发Db4objects.Db4o.Ext.DatabaseClosedException
我是个新的c和MVC,今天我一直在玩DB4o。我已经建立了一个实践网站,通过用户提供的url刮取电影。然后将这些胶片存储在db4o数据库中。但是,我现在似乎得到了一个Db4objects.Db4o.Ext.DatabaseClosedException 每次我启动网站时都会抛出。我有一种感觉,我在不关闭当前连接的情况下给数据库打了太多的电话 这是我的控制器,我相信这是问题的根源C# 正在引发Db4objects.Db4o.Ext.DatabaseClosedException,c#,asp.net-mvc-4,db4o,C#,Asp.net Mvc 4,Db4o,我是个新的c和MVC,今天我一直在玩DB4o。我已经建立了一个实践网站,通过用户提供的url刮取电影。然后将这些胶片存储在db4o数据库中。但是,我现在似乎得到了一个Db4objects.Db4o.Ext.DatabaseClosedException 每次我启动网站时都会抛出。我有一种感觉,我在不关闭当前连接的情况下给数据库打了太多的电话 这是我的控制器,我相信这是问题的根源 using System; using System.Collections.Generic; using
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>
}
}
然而,这可能是由于我的干预。谢谢你在这件事上的帮助 问题似乎是每次创建后都要关闭连接。db4o对象容器在应用程序运行时始终保持打开状态。查看以了解更多信息 如果您仍然愿意在每次更新后打开和关闭连接,那么您应该在方法Create的开头放置以下行
IObjectContainer db4o = Db4oEmbedded.OpenFile(YapFileName);
您将打开对象容器一次,但在每次事务完成后将其关闭
希望这有帮助。正如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);