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 の新しいインスタンスを作成します。

しばらくして (その間にデータベースが閉じられました)、データベースからそれを取得して項目を追加します。

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 がリスト自体への変更を認識していないため、何も変更されていないことを db4o が認識していないという情報を見つけました...これは正しいですか?

また、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 に答える