Stored scompare IEnumerable sul riavvio di debug, ma ricreando IObjectServer e IObjectClient in uno unit test è ok
Domanda
Sono la memorizzazione di un oggetto IUSER in un database db4o come segue (cliente è un IObjectClient):
public Guid AddUser(IUser user)
{
lock (userLock)
{
user.Id = Guid.NewGuid();
client.Store(user);
client.Commit();
}
return user.Id;
}
L'attuazione di IUSER che viene qui utilizzato ha il campo che si descriverli in IUSER IEnumerable<Roles> Roles { get;}
realizzato con un campo IList<Roles> = new List<Roles>()
supporto
Quando eseguo il seguente unittest tutto funziona bene:
[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 gli stessi metodi (adduser e getUser) nel mio sito web, separati da un "debug riavvio", tuttavia, il GetUser () restituisce l'IUSER correttamente, ma con la Roles.Count() == 0
Soluzione
Un problema potrebbe essere l'aggiornamento-deph . Nel test, si utilizza un nuovo IUSER creato e usa .AddRole () su di esso. Quindi, tutto funziona bene. Tuttavia, non appena si chiama .AddRole () su un esistente IUSER l'update-deph è rilevante.
Per impostazione predefinita, solo l'oggetto passato a IObjectContainer.Store () vengono aggiornati. Tutto l'oggetto fa riferimento non vengono aggiornati. Dal momento che una lista è anche un oggetto, non viene aggiornato.
Pertanto è necessario questo possibilità:
- Aumentare l'aggiornamento-deph nella configurazione. In entrambi i globaly, per alcune classi o con la cascata-update-bandiera
- memorizzare l'elenco esplicito con IObjectContainer.Store ()
- trasparente Persistenza
Se questo non è il problema, mi dica e io tolgo questa risposta.
Tra l'altro. Ho la db4o versione stai usando (7.4) ha un non ottimale Guid-Handling. Forse si dovrebbe prendere in considerazione la versione più recente, 7.12.