这是我考虑使用DB4o的方式。当我需要查询时,我会打开文件,阅读并关闭:
using (IObjectContainer db = Db4oFactory.OpenFile(Db4oFactory.NewConfiguration(), YapFileName))
{
try
{
List<Pilot> pilots = db.Query<Pilot>().ToList<Pilot>();
}
finally
{
try { db.Close(); }
catch (Exception) { };
}
}
稍后,当我需要插入时,
using (IObjectContainer db = Db4oFactory.OpenFile(Db4oFactory.NewConfiguration(), YapFileName))
{
try
{
Pilot pilot1 = new Pilot("Michael Schumacher", 100);
db.Store(pilot1);
}
finally
{
try { db.Close(); }
catch (Exception) { };
}
}
通过这种方式,我认为只要在需要时将文件打开,我就会保持文件更整洁,并且大部分时间都关闭文件。但我一直得到InvalidCastException
Unable to cast object of type 'Db4objects.Db4o.Reflect.Generic.GenericObject' to type 'Pilot'
使用DB4o的正确方法是什么?
答案 0 :(得分:5)
不,以这种方式工作不是一个好主意。 db4o ObjectContainers旨在在应用程序运行时保持打开状态。有几个原因:
您无需担心持续打开数据库文件。 db4o的关键目标之一是(移动)设备中的嵌入式使用。这就是为什么我们编写db4o的原因是你可以随时关闭你的机器而不会有数据库损坏的风险,即使文件仍处于打开状态。
为什么要获得GenericObject而不是Pilot对象的可能原因:
答案 1 :(得分:1)
可以多次重新打开数据库。问题在于表现并失去“身份”。此外,您无法保持对查询结果的引用,并在关闭数据库后尝试迭代它(基于您的代码,看起来您想这样做)。
当无法找到类时,会实例化GenericObjects。
你能提供一个完整的,极简主义的样本吗?
另外,您使用的是哪个db4o版本?
最佳