【问题标题】:db4o does not seem to store items added to a List<T>db4o 似乎没有存储添加到 List<T> 的项目
【发布时间】:2012-11-21 03:17:34
【问题描述】:

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

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);

会有所帮助,但不会。

这都是在 Debian 上使用 db4o v8 和 Mono 2.11

【问题讨论】:

    标签: c# .net db4o


    【解决方案1】:

    您偶然发现了激活深度。

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

     database.Store(page.Items)
    

    或者增加update depth。或者切换到transparent persistence

    【讨论】:

    • 这很奇怪。你有一个正在运行的例子吗?
    • 我会尝试看看我是否可以独立获得它,它是更大系统的一部分,但这很奇怪。我使用 database.Query 来获取对象,我使用 for each 循环它们,将一些项目添加到列表中并存储它们(object.list 和对象本身),然后在我提交循环之后。日志记录显示所有这些正在发生...但数据库列表中没有任何内容
    • 好吧,这很奇怪,现在我创建了一个快速的独立示例,它无需添加任何配置即可工作。我会再次检查我的代码并回复你
    • 好吧,这是不知道我必须按照你的建议存储项目和我的愚蠢的组合......我的查询中有一个错误,在尝试了你的建议后,我使用检查了数据库对象管理器即使它们在那里也不会显示我的列表项目,所以我认为它不起作用。感谢您的帮助!
    【解决方案2】:

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

    database.Ext().Store(package, int.MaxValue);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多