C# 重新启动调试时存储的IEnumerable dissapes,但在一个单元测试中重新创建IObjectServer和IObjectClient是可以的

C# 重新启动调试时存储的IEnumerable dissapes,但在一个单元测试中重新创建IObjectServer和IObjectClient是可以的,c#,.net,db4o,C#,.net,Db4o,我将IUser对象存储在Db4o数据库中,如下所示(客户机是IObjectClient): 这里使用的IUser的实现具有IUserIEnumerable Roles{get;}中描述的字段,该字段使用支持字段IList=new List()实现 当我运行以下UnitTest时,一切正常: [TestMethod] public void UserStaysInRoleAfterServerRestart() { string filePath = IOHelper.MakeAbsolu

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

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

当我运行以下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,但使用的是
角色。Count()==0
可能会出现一个问题。在测试中,使用新创建的IUser并对其使用.AddRole()。所以一切正常。但是,只要您在现有IUser上调用.AddRole(),更新deph就相关了。
默认情况下,仅更新传递给IObjectContainer.Store()的对象。所有引用的对象都不会更新。因为列表也是一个对象,所以它不会被更新。 因此,您有以下可能性:

  • 使用IObjectContainer.Store()显式存储列表
  • 或使用
如果不是这个问题,告诉我,我会删除这个答案

顺便说一下。I您正在使用的db4o版本(7.4)具有次优的Guid处理。也许你应该考虑新版本,7.12。 一个问题可能是。在测试中,使用新创建的IUser并对其使用.AddRole()。所以一切正常。但是,只要您在现有IUser上调用.AddRole(),更新deph就相关了。
默认情况下,仅更新传递给IObjectContainer.Store()的对象。所有引用的对象都不会更新。因为列表也是一个对象,所以它不会被更新。 因此,您有以下可能性:

  • 使用IObjectContainer.Store()显式存储列表
  • 或使用
如果不是这个问题,告诉我,我会删除这个答案


顺便说一下。I您正在使用的db4o版本(7.4)具有次优的Guid处理。也许你应该考虑新版本,7.12。 完整的代码可以在上找到完整的代码可以在上找到我将检查更新深度,但我认为创建一个新的服务器和客户端将确保我不是在缓存上运行,而是在实际从文件中检索对象时运行。有没有办法绕过缓存,确保所有内容都正确持久化?我尝试了v7.12,但在单元测试中遇到了各种疯狂的绑定问题。我的所有测试都在filenotfound异常上失败,这迫使我开始在注册表中添加键以进行绑定日志记录,然后挖掘这些日志并手动将丢失的库复制粘贴到我的单元测试的bin文件夹中。所有的测试都是以前运行过的,所以我决定等待未来的稳定版本,因为我还没有遇到值得麻烦的问题。我所说的问题将出现在测试的第一部分。您可以在这里创建IUser,向其中添加角色并存储它。这个很好用。但是,当您首先创建用户、存储它、稍后检索它、添加角色并再次存储时,更新深度就会变得相关。如果它太低,它就不起作用了。不,您不能绕过ObjectContainer缓存。这个缓存对于db4o是必不可少的。(这有点像Hibernate会话或LINQ到SQL上下文)。7.4到7.12版迁移:是的,下次吧。啊哈!事实上,在我的网站中,我首先创建并保存用户,然后添加角色并再次保存(=更新)。谢谢:DI将检查更新深度,但我认为创建一个新的服务器和客户端将确保我不是在缓存上运行,而是在实际从文件中检索对象上运行。有没有办法绕过缓存,确保所有内容都正确持久化?我尝试了v7.12,但在单元测试中遇到了各种疯狂的绑定问题。我的所有测试都在filenotfound异常上失败,这迫使我开始在注册表中添加键以进行绑定日志记录,然后挖掘这些日志并手动将丢失的库复制粘贴到我的单元测试的bin文件夹中。所有的测试都是以前运行过的,所以我决定等待未来的稳定版本,因为我还没有遇到值得麻烦的问题。我所说的问题将出现在测试的第一部分。您可以在这里创建IUser,向其中添加角色并存储它。这个很好用。但是,当您首先创建用户、存储它、稍后检索它、添加角色并再次存储时,更新深度就会变得相关。如果它太低,它就不起作用了。不,您不能绕过ObjectContainer缓存。这个缓存对于db4o是必不可少的。(这有点像Hibernate会话或LINQ到SQL上下文)。7.4到7.12版迁移:是的,下次吧。啊哈!事实上,在我的网站中,我首先创建并保存用户,然后添加角色并再次保存(=更新)。谢谢:D
[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));
}