재시작 디버그시 IENUMERABLE DESAPEARS를 저장했지만 한 단위 테스트에서 iObjectServer 및 iobjectClient를 재현하는 것은 괜찮습니다.
문제
다음과 같이 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 ()에 전달 된 객체 만 업데이트됩니다. 참조 된 모든 객체는 업데이트되지 않습니다. 목록도 객체이므로 업데이트되지 않습니다. 그러므로 당신은이 가능성을 가지고 있습니다.
- 구성에서 업데이트 다이퍼를 늘리십시오. globaly, 일부 클래스 또는 Cascade-Update-Flag.
- iobjectContainer.store ()로 명시 적 목록을 저장하십시오.
- 또는 사용 투명한 지속
그것이 문제가되지 않으면 말해 주시면이 답을 제거하겠습니다.
그런데. 나는 당신이 사용하고있는 db4o-version (7.4)에는 차선책이 필요합니다. 아마도 새로운 버전 인 7.12를 고려해야 할 것입니다.
제휴하지 않습니다 StackOverflow