1

假设我有一个看起来像这样的模型(假的,但作为示例)

public class PackageItem
{
    public string Name { get; set;}
    public bool Available { get; set;}
}

public class Package
{
    public string Recipient { get; set;}
    public List<PackageItem> Items { get; set;}
}

首先创建一个新的 Package 实例,其中仅将 Recipient 设置为某个值。

一段时间后,(数据库已在其间关闭),我从数据库中检索它并向其中添加项目:

var packages = database.Query<Package>()
foreach(var package in packages)
{
    package.Recipient = "Bla bla bla";
    package.Items.Add(new PackageItem() { Name = "SomeName", Available = true });
    database.Store(package);
}
database.Commit();

此时,对 Recipient 属性的更改保存在数据库中,但对 Items 属性的添加没有。

我发现一些关于 db4o 的信息不知道发生了什么变化,因为对 List 的引用没有改变,并且 db4o 不知道 List 本身的变化......这是正确的吗?

使用 db4o 时应该如何处理 T 列表?

*更新:*我认为执行

database.Store(package.Items);

会有所帮助,但它没有。

这都是在带有 Mono 2.11 的 Debian 上使用 db4o v8

4

2 回答 2

5

您偶然发现了激活深度。

看看文档。您要么需要明确地将更改存储在集合中:

 database.Store(page.Items)

或者增加更新深度。或者切换到透明持久性

于 2012-11-21T14:05:16.660 回答
3

除了 Gamlor 提到的选项之外,您还可以在 Store 方法本身中显式定义更新深度(重载的 Store 方法隐藏在 Ext 中),例如:

database.Ext().Store(package, int.MaxValue);
于 2012-11-21T22:16:14.213 回答