Gespeicherte IEnumerable verschwindet beim Neustart debug, sondern neu zu IObjectServer und IObjectClient in einem Unit-Test ist ok

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

  •  20-09-2019
  •  | 
  •  

Frage

Ich bin Speichern eines IUser Objekt in einer Datenbank Db4o wie folgt (Client ist ein IObjectClient):

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

Die Implementierung von IUser, die hier verwendet wird, hat das Feld, das in IUser discribed ist IEnumerable<Roles> Roles { get;} mit einem Trägerfeld IList<Roles> = new List<Roles>() implementiert

Wenn ich den folgenden Unittest funktioniert alles einwandfrei:

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

Wenn ich die gleichen Methoden (AddUser und GetUser) verwende in meiner Website, getrennt durch ein „Neustart-Debugging“ jedoch die GetUser () gibt die IUser richtig, aber mit dem Roles.Count() == 0

War es hilfreich?

Lösung

Man könnte Thema sein die update-deph . In Ihrem Test verwenden Sie eine neue erstellt IUser und verwenden .AddRole () auf sie. So funktioniert alles einwandfrei. Doch sobald Sie .AddRole () auf einem bestehenden IUser rufen das Update-deph relevant ist.
Standardmäßig wird nur das Objekt zu IObjectContainer.Store () übergibt aktualisiert. All das Objekt referenziert werden nicht aktualisiert. Da eine Liste ist auch ein Ziel, wird es nicht aktualisiert. Deshalb haben Sie diese Möglichkeiten:

Wenn das nicht das Problem ist, so sagt mir, und ich werde diese Antwort entfernen.

Durch die Art und Weise. Ich die db4o-Version Sie verwenden (7.4) eine suboptimale Guid-Handhabung. Vielleicht sollten Sie die neuere Version prüfen, 7,12.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top