Almacenada desaparece IEnumerable sobre depuración de reinicio, pero recreando IObjectServer y IObjectClient en una unidad de prueba es aceptable
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
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:
- Aumentar la actualización-deph en la configuración. De cualquier globaly, para algunas clases o con la cascada-update-bandera
- Guarde la lista explícita con IObjectContainer.Store ()
- transparente Persistencia
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.