Сохраненный IEnumerable исчезает при перезапуске отладки, но воссоздание IObjectServer и IObjectClient в одном модульном тестировании в порядке

StackOverflow https://stackoverflow.com/questions/2063775

  •  20-09-2019
  •  | 
  •  

Вопрос

Я сохраняю объект 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().Все объекты, на которые ссылаются, не обновляются.Поскольку список также является объектом, он не обновляется.Следовательно, у вас есть такие возможности:

Если проблема не в этом, скажите мне, и я удалю этот ответ.

Кстати.I используемая вами версия db4o (7.4) имеет неоптимальную обработку Guid.Возможно, вам следует рассмотреть более новую версию, 7.12.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top