保存された IEnumerable はデバッグの再起動で消えますが、1 つの単体テストで IObjectServer と IObjectClient を再作成しても問題ありません
質問
次のように 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));
}
Web サイトで同じメソッド (AddUser と GetUser) を「デバッグの再開」で区切って使用すると、GetUser() は IUser を正しく返しますが、 Roles.Count() == 0
解決
1 つの問題として考えられるのは、 更新デフ. 。テストでは、新しく作成した IUser を使用し、それに .AddRole() を使用します。したがって、すべてがうまくいきます。ただし、既存の IUser で .AddRole() を呼び出すとすぐに、update-deph が関連します。
デフォルトでは、IObjectContainer.Store() に渡されたオブジェクトのみが更新されます。参照されているすべてのオブジェクトは更新されません。リストもオブジェクトなので更新されません。したがって、次の可能性があります。
- 構成内の update-deph を増やします。グローバル、一部のクラス、またはカスケード更新フラグを使用して
- IObjectContainer.Store() を使用してリストを明示的に保存します
- または使用します 透明な持続性
それが問題でない場合は、教えてください。この回答は削除します。
ところで。使用している db4o バージョン (7.4) の Guid-Handling は最適ではありません。おそらく、新しいバージョン 7.12 を検討する必要があります。
所属していません StackOverflow