Stocké dissapears IEnumerable sur le débogage de redémarrage, mais de recréer IObjectServer et IObjectClient dans un test unitaire est ok
Question
je stocker un objet dans une base de données IUser db4o comme suit (le client est un IObjectClient):
public Guid AddUser(IUser user)
{
lock (userLock)
{
user.Id = Guid.NewGuid();
client.Store(user);
client.Commit();
}
return user.Id;
}
La mise en œuvre de IUser qui est utilisé ici a le champ qui est en IUser IEnumerable<Roles> Roles { get;}
décrivait mis en œuvre avec un champ de support IList<Roles> = new List<Roles>()
Quand je lance le tout UnitTest suivant fonctionne très 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));
}
Quand j'utilise les mêmes méthodes (AddUser et GetUser) dans mon site, séparés par un « débogage redémarrage » cependant, le GetUser () retourne correctement le IUser, mais avec le Roles.Count() == 0
La solution
Une question pourrait être la mise à jour-deph . Dans votre essai, vous utilisez une nouvelle .AddRole () créé IUser et utiliser sur elle. Donc, tout fonctionne bien. Cependant, dès que vous appelez .AddRole () sur une mise à jour existante IUser la-deph est pertinente.
Par défaut, seul l'objet passé à IObjectContainer.Store () sont mis à jour. Tout l'objet référencé ne sont pas mis à jour. Étant donné que la liste est aussi un objet, il est pas mis à jour.
Par conséquent, vous avez cette possibilité:
- Augmenter la mise à jour-deph dans la configuration. Soit globaly, pour certaines classes ou avec la cascade update-drapeau
- Conservez la liste explicite avec IObjectContainer.Store ()
- Ou utilisez Transparent Persistance
Si ce n'est pas la question, dites-moi et je vais supprimer cette réponse.
Par ailleurs. Je la db4o version que vous utilisez (7.4) a une sous-optimale Guid-Handling. Peut-être que vous devriez envisager la nouvelle version, 7.12.