1

私は、dbが埋め込まれたシンプルなアプリにdb4oを使用しています。オブジェクトを保存してからオブジェクトを変更すると、db4oが変更されたオブジェクトを返すと思いますか?

コードは次のとおりです。

[Test]
    public void NonReferenceTest()
    {
      Aim localAim = new Aim("local description", null);
      dao.Save(localAim);

      // changing the local value should not alter what we put into the dao
      localAim.Description = "changed the description";

      IQueryable<Aim> aims = dao.FindAll();

      var localAim2 = new Aim("local description", null);
      Assert.AreEqual(localAim2, aims.First());
    }

テストは失敗します。特別な方法でdb4oコンテナをセットアップする必要がありますか?コミット呼び出しでラップしますか?ありがとう

4

1 に答える 1

1

実際には、そのように機能するはずです。データだけでなくオブジェクトも操作していることに注意する必要があります。

オブジェクトをオブジェクトデータベースに(またはオブジェクトデータベースから)格納(またはクエリ)するとき、格納されたデータとオブジェクト間のリンクをメモリに保持します。これは、オブジェクトを更新してデータベースに保存するときに必要です。実際には、新しいオブジェクトを保存する必要はありませんが、古いオブジェクトを更新する必要があります。したがって、メモリにまだ存在するオブジェクトを取得すると、そのオブジェクトへの参照が与えられます。

もう1つの理由は、データの整合性です。コードをもう一度見て、更新されたオブジェクトへの参照ではなく、データベースのデータを提供すると想像してください。

Aim localAim = new Aim("local description", null);
dao.Save(localAim);

// changing the local value should not alter what we put into the dao
localAim.Description = "changed the description";

IQueryable<Aim> aims = dao.FindAll();

var localAim2 = aims.First();

// Assuption A: localAim2 != localAim
localAim2.Description += " added s/t";

dao.Save(localAim); 
// with Assuption A you now have "changed the description" in database
dao.Save(localAim2);
// with Assuption A you now have "local description added s/t"

Assuption A(localAim2!= localAim)の問題は、2つの異なる内容でデータベースに格納されている同じオブジェクトで作業することです。Assuption A(つまり、localAim2 == localAim)がない場合、オブジェクトが1つしかない(2回参照される)ため、データは常に一貫しています。

于 2009-09-10T17:36:01.827 に答える