Сохраненный 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) на своем веб-сайте, разделенные "restart debugging", getUser() возвращает IUser корректно, но с Roles.Count() == 0
Решение
Одной из проблем может быть обновление-deph.В вашем тесте вы используете новый созданный IUser и используете .addRole() для него.Так что все работает нормально.Однако, как только вы вызываете .addRole() для существующего пользователя IUser значение update-deph является актуальным.
По умолчанию обновляется только объект, переданный в IObjectContainer.Функция Store().Все объекты, на которые ссылаются, не обновляются.Поскольку список также является объектом, он не обновляется.Следовательно, у вас есть такие возможности:
- Увеличьте время обновления в конфигурации.Либо глобально, для некоторых классов, либо с флагом каскадного обновления
- Сохраните список явно с помощью IObjectContainer.Сохранить()
- Или использовать Прозрачная Настойчивость
Если проблема не в этом, скажите мне, и я удалю этот ответ.
Кстати.I используемая вами версия db4o (7.4) имеет неоптимальную обработку Guid.Возможно, вам следует рассмотреть более новую версию, 7.12.