1

我将 IUser 对象存储在 Db4o 数据库中,如下所示(客户端是 IObjectClient):

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

此处使用的 IUser 实现具有 IUser 中描述的字段,该字段IEnumerable<Roles> Roles { get;}使用支持字段实现IList<Roles> = new List<Roles>()

当我运行以下 UnitTest 时,一切正常:

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

但是,当我在我的网站中使用相同的方法(AddUser 和 GetUser)并由“重新启动调试”分隔时,GetUser() 会正确返回 IUser,但Roles.Count() == 0

4

1 回答 1

1

一个问题可能是update-deph。在您的测试中,您使用新创建的 IUser 并在其上使用 .AddRole()。所以一切正常。但是,只要您在现有 IUser 上调用 .AddRole() ,update-deph 就会相关。
默认情况下,仅更新传递给 IObjectContainer.Store() 的对象。所有引用的对象都不会更新。由于列表也是一个对象,因此它不会被更新。因此,您有这种可能性:

如果这不是问题,请告诉我,我将删除此答案。

顺便一提。我正在使用的 db4o 版本(7.4)有一个次优的 Guid-Handling。也许你应该考虑更新版本,7.12。

于 2010-01-14T13:02:13.457 回答