سؤال

أنا أستخدم DB4O لتطبيق بسيط ، مع DB مضمن. عندما أقوم بحفظ كائن ، ثم أغير الكائن ، هل يفترض أن 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 بأي طريقة خاصة؟ لفها في مكالمات الالتزام؟ شكرًا

هل كانت مفيدة؟

المحلول

في الواقع ، من المفترض أن تعمل بهذه الطريقة. عليك أن تضع في اعتبارك أنك تتلاعب بالكائنات وليس البيانات فقط.

عند تخزين (أو الاستعلام) كائن إلى (أو من) database الكائن ، فإنه يحافظ على الارتباط بين البيانات المخزنة والكائن في الذاكرة. هذا مطلوب عند تحديث الكائن وتخزينه في قاعدة البيانات. أنت في الواقع لا تريد تخزين كائن جديد ولكنك تريد تحديث الكائن القديم. لذلك ، عند استرداد كائن لا يزال موجودًا في الذاكرة ، سيتم إعطاؤك إشارة إلى هذا الكائن.

سبب آخر هو سلامة البيانات. انظر إلى الكود الخاص بك مرة أخرى ، وتخيل أنه يمنحك بيانات قاعدة البيانات وليس إشارة إلى الكائن المحدث:

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"

تكمن مشكلة التأثير A (localaim2! = localaim) في أنك تعمل على نفس الكائن المخزّن في قاعدة البيانات مع محتويات مختلفة. بدون تأييد A (أي ، localaim2 == localaim) ، فإن بياناتك متسقة للتو لأن لديك كائن واحد فقط (المشار إليه مرتين).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top