1

次のように IUser オブジェクトを Db4o データベースに格納しています (クライアントは IObjectClient です)。

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

ここで使用される IUser のIEnumerable<Roles> Roles { get;}実装には、バッキング フィールドで実装された IUser に記述されているフィールドがあります。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

4

1 に答える 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 に答える