質問

私は、組み込み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のコンテナが必要なのでしょうか?コミットの呼び出しでそれをラップ?おかげ

役に立ちましたか?

解決

は実際には、そのように動作することになっています。あなたはだけでなく、データオブジェクトを操作するあなたがあることを心に留めておく必要があります。

オブジェクトデータベースへ(又はから)オブジェクトを格納する(又は問い合わせる)場合

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

もう一つの理由は、データの整合性です。あなたのコードを見て、再び、それはあなたのデータベースのデータおよび更新されたオブジェクトを参照するのではなくを与える想像します:

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つの異なる内容でデータベースに格納されているのと同じオブジェクト上で動作していることです。 あなたが1つのオブジェクトのみ(参照2回)を持っているのでAssuption A(すなわち、localAim2 == localAim)がなければ、あなたのデータはオールウェイズ一貫してます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top