DB4O:需要在使用连接块</t>之外使用GenericList <t>

时间:2011-04-23 10:28:32

标签: c# db4o

我使用DB4O来存储我的对象。请从DBO4 DB中找到以下代码to retrieve objects

public IList<T> GetList<T>()
        {
            IList<T> list = null;
            using (IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), fullFilePath))
            {
                list = db.Query<T>(typeof(T));
            }
            return list;
        }

问题是,我不能在使用块之外应用C#'foreach'循环。它给了我一个错误“抛出类型'Db4objects.Db4o.Ext.DatabaseClosedException'的异常。”一旦我开始遍历我的列表outside of Using block

能够使用块来应用C#'foreach'循环,但我想将我的通用列表用于另一个代码层。所以,我必须要我的使用块之外的通用列表对象。

请给我解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:3)

只需添加'Femaref'答案&amp;注释:

1)是的,您需要为每个连接添加新配置。 2)打开数据库需要一段时间。 db4o需要读取元数据,检查事务是否已完成等。

通常,您不应完全打开和关闭每个操作的容器。这需要花费大量时间来打开和关闭数据库。我想你想为每个操作使用一个新的对象容器来为每个操作创建一个事务。

我建议你稍微改变一下实现。应用程序启动时打开对象容器。关闭应用程序时关闭它。然后对每个操作使用session containers。这应该快得多,因为db4o不需要进行所有初始化工作。

像这样:

// Open the container once for the life-time of your application
IObjectConainer rootContainer = Db4oEmbedded.OpenFile(......)

public IList<T> GetList<T>()
{
    using (IObjectContainer db = rootContainer.Ext().OpenSession())
    {
                    // As Femaref said, use to list to 'eagerly' load all data
        return db.Query<T>(typeof(T)).ToList();
    }
}

答案 1 :(得分:1)

您有两种可能性:

  1. 自己处理db对象
  2. 从数据库中获取所需的所有数据(例如,通过ToList),它会迭代IEnumerable<T>并返回该数据。