재시작 디버그시 IENUMERABLE DESAPEARS를 저장했지만 한 단위 테스트에서 iObjectServer 및 iobjectClient를 재현하는 것은 괜찮습니다.

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

  •  20-09-2019
  •  | 
  •  

문제

다음과 같이 DB4O 데이터베이스에 iuser 객체를 저장하고 있습니다 (클라이언트는 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>()

다음 유닛 테스트를 실행하면 모든 것이 잘 작동합니다.

[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 ()을 사용합니다. 그래서 모든 것이 잘 작동합니다. 그러나 기존 iuser에서 .addrole ()을 호출하자마자 업데이트는 관련이 있습니다.
기본적으로 iobjectContainer.store ()에 전달 된 객체 만 업데이트됩니다. 참조 된 모든 객체는 업데이트되지 않습니다. 목록도 객체이므로 업데이트되지 않습니다. 그러므로 당신은이 가능성을 가지고 있습니다.

그것이 문제가되지 않으면 말해 주시면이 답을 제거하겠습니다.

그런데. 나는 당신이 사용하고있는 db4o-version (7.4)에는 차선책이 필요합니다. 아마도 새로운 버전 인 7.12를 고려해야 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top