Ienumerable armazenado desaparece em depuração de reinicialização, mas recriar o IObjectServer e o IObjectClient em um teste de unidade está ok

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

  •  20-09-2019
  •  | 
  •  

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

Foi útil?

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:

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top