Ienumerable armazenado desaparece em depuração de reinicialização, mas recriar o IObjectServer e o IObjectClient em um teste de unidade está ok
Pergunta
Estou armazenando um objeto iuser em um banco de dados DB4O da seguinte maneira (o cliente é um IObjectClient):
public Guid AddUser(IUser user)
{
lock (userLock)
{
user.Id = Guid.NewGuid();
client.Store(user);
client.Commit();
}
return user.Id;
}
A implementação do iuser que é usada aqui tem o campo que é descrito em iuser IEnumerable<Roles> Roles { get;}
implementado com um campo de apoio IList<Roles> = new List<Roles>()
Quando eu corro o seguinte, tudo o que tudo funciona bem:
[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));
}
Quando uso os mesmos métodos (adduser e getuser) no meu site, separados por uma "reiniciar depuração", no entanto, o getUser () retorna o iuser corretamente, mas com o Roles.Count() == 0
Solução
Uma questão pode ser A UPDATE-DEPH. No seu teste, você usa um novo iuser criado e usa .addrole () nele. Então tudo funciona bem. No entanto, assim que você chama .Addrole () em um iuser existente, a atualização é relevante.
Por padrão, apenas o objeto passado para iobjectContainer.store () é atualizado. Todo o objeto referenciado não é atualizado. Como uma lista também é um objeto, ela não é atualizada. Portanto, você tem essas possibilidades:
- Aumente a atualização-Deph na configuração. Globaly, para algumas classes ou com a flag em cascata
- Armazene a lista explícita com iObjectContainer.store ()
- Ou uso Persistência transparente
Se esse não é o problema, diga -me e eu removerei esta resposta.
A propósito. I O DB4O-VERSION que você está usando (7.4) possui uma manipulação subótima do Guid. Talvez você deva considerar a versão mais recente, 7.12.