يختفي IEnumerable المخزن عند إعادة تشغيل التصحيح، ولكن إعادة إنشاء IObjectServer وIObjectClient في اختبار وحدة واحدة أمر جيد
سؤال
أقوم بتخزين كائن IUser في قاعدة بيانات Db4o على النحو التالي (العميل هو IObjectClient):
public Guid AddUser(IUser user)
{
lock (userLock)
{
user.Id = Guid.NewGuid();
client.Store(user);
client.Commit();
}
return user.Id;
}
يحتوي تطبيق IUser المستخدم هنا على الحقل الموضح في IUser IEnumerable<Roles> Roles { get;}
نفذت مع حقل الدعم IList<Roles> = new List<Roles>()
عندما أقوم بتشغيل UnitTest التالي، كل شيء يعمل بشكل جيد:
[TestMethod]
public void UserStaysInRoleAfterServerRestart()
{
string filePath = IOHelper.MakeAbsolute(ConfigurationManager.AppSettings["userRepository.path.db4o"] + "1");
IUser expected = GenerateTestUser();
expected.AddRole(Roles.Anonymous);
IObjectServer userServer1 = Db4oFactory.OpenServer(filePath, 0);
IUserRepository repo = new UserRepository(userServer1);
repo.AddUser(expected);
userServer1.Close();
IObjectServer userServer2 = Db4oFactory.OpenServer(filePath, 0);
IUserRepository repo2 = new UserRepository(userServer2);
IUser actual = repo2.GetUser(expected.Id);
Assert.IsTrue(actual.IsInRole(Roles.Anonymous));
}
عندما أستخدم نفس الطرق (AddUser وGetUser) في موقع الويب الخاص بي، مفصولة بـ "إعادة تشغيل تصحيح الأخطاء"، ومع ذلك، يقوم GetUser() بإرجاع IUser بشكل صحيح، ولكن مع Roles.Count() == 0
المحلول
قضية واحدة يمكن أن تكون عمق التحديث.في الاختبار الخاص بك، يمكنك استخدام IUser جديد تم إنشاؤه واستخدام .AddRole() عليه.لذلك كل شيء يعمل بشكل جيد.ومع ذلك، بمجرد استدعاء .AddRole() على IUser موجود، يصبح التحديث ذو صلة.
افتراضيًا، يتم تحديث الكائن الذي تم تمريره إلى IObjectContainer.Store() فقط.لا يتم تحديث كافة الكائنات المشار إليها.وبما أن القائمة هي أيضًا كائن، فلا يتم تحديثها.لذلك لديك هذه الاحتمالات:
- زيادة عمق التحديث في التكوين.إما عالميًا أو لبعض الفئات أو باستخدام علامة التحديث المتتالي
- قم بتخزين القائمة بشكل صريح باستخدام IObjectContainer.Store()
- او استعمل الثبات الشفاف
إذا لم تكن هذه هي المشكلة، أخبرني وسأقوم بإزالة هذه الإجابة.
بالمناسبة.أنا الإصدار db4o الذي تستخدمه (7.4) لديه معالجة توجيهية دون المستوى الأمثل.ربما عليك أن تفكر في الإصدار الأحدث، 7.12.