Almacenada desaparece IEnumerable sobre depuración de reinicio, pero recreando IObjectServer y IObjectClient en una unidad de prueba es aceptable

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

  •  20-09-2019
  •  | 
  •  

Pregunta

Estoy almacenando un objeto en una base de datos IUser Db4o de la siguiente manera (cliente es un IObjectClient):

public Guid AddUser(IUser user)
{
    lock (userLock)
    {
        user.Id = Guid.NewGuid();
        client.Store(user);
        client.Commit();
    }
    return user.Id;
}

La implementación de IUser que se usa aquí tiene el campo que está carente en IUser IEnumerable<Roles> Roles { get;} implementado con un respaldo IList<Roles> = new List<Roles>() campo

Al ejecutar el siguiente unittest todo funciona bien:

[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));
}

Cuando uso los mismos métodos (AddUser y getUser) en mi página web, separadas por un "depuración reinicio" sin embargo, el GetUser () devuelve el IUser correctamente, pero con la Roles.Count() == 0

¿Fue útil?

Solución

Una cuestión podría ser la actualización deph-. En la prueba, se utiliza un nuevo IUser creado y utilizar .AddRole () sobre ella. Así que todo funciona bien. Sin embargo, tan pronto como se llama a .AddRole () en una ya existente IUser la actualización-deph es relevante.
Por defecto sólo el objeto pasado a IObjectContainer.Store () se actualizan. Todo el objeto referenciado no se actualizan. Desde una lista es también un objeto, no se actualiza. Por lo tanto usted tiene estas posibilidades:

Si ese no es el problema, dime y voy a quitar esta respuesta.

Por cierto. Yo la db4o-versión que está usando (7.4) tiene una subóptima Guid-manipulación. Tal vez debería considerar la versión más reciente, 7,12.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top