1

DB4Oのクライアントセッション間でオブジェクトを使用できるようにする方法を見つけようとしています。私の理解では、クライアントセッションが閉じられると、オブジェクトはキャッシュに存在しなくなり、有効なUUIDがあるにもかかわらず、複製を挿入せずにストアを呼び出すことはできません。手動でキャッシュに再追加する方法を探しましたが、そのようなメカニズムはありません。再取得すると、現在は役に立たないオブジェクトからすべての値をコピーする必要があります。

上記のコードの段落は次のとおりです。

Person person = new Person() { FirstName = "Howdoyu", LastName = "Du" };
Db4oUUID uuid;

 // Store the new person in one session
using (IObjectContainer client = server.OpenClient())
{
    client.Store(person);
    uuid = client.Ext().GetObjectInfo(person).GetUUID();
}

// Guy changed his name, it happens
person.FirstName = "Charlie";

using (var client = server.OpenClient())
{
    // TODO: MISSING SOME WAY TO RE-USE UUID HERE

    client.Store(person); // will create a new person, named charlie, instead of changing Mr. Du's first name
}

Eloqueraの最新バージョンは、[ID]属性またはStore(uid、object)を介して、これらのシナリオをサポートします。

何かご意見は?

4

2 に答える 2

1

この機能は確かにdb4o=(に欠けています。そのため、多くのシナリオでdb4oを使用するのは非常に困難です。

基本的に、すべての属性をコピーして、独自のreattachメソッドを作成する必要があります。Automapperのようなライブラリが役立つかもしれませんが、最終的には自分で行う必要があります。

もう1つの質問は、db4oUUIDを使用してオブジェクトを本当に識別したいかどうかです。db4o UUIDは巨大で、よく知られたタイプではありません。個人的には、通常の.NETGUIDを好みます。

ちなみに、オブジェクトを既存のIDにバインドするdb4o .Bind()メソッドがあります。しかし、それはあなたが本当に望むことをほとんどしません。オブジェクトに加えられた変更を保存したいと思います。バインドは基本的にオブジェクトを置き換え、オブジェクトグラフを壊します。たとえば、部分的にロードされたオブジェクトがあり、それをバインドすると、オブジェクトへの参照が失われます。したがって、.Bindは使用できません。

于 2011-05-02T08:06:00.123 に答える
1

さて、db4o IExtContainer.Bind()メソッドに関するGamlorの応答は、私に解決策を示しました。このソリューションは、DBへのアクセスが厳密に制御され、外部クエリがオブジェクトインスタンスを取得できない非常に特殊な状況でのみ有効であることに注意してください。

警告:この解決策は危険です。オブジェクトを置き換え、その値を更新しないため、データベースへのあらゆる種類の重複オブジェクトやジャンクオブジェクトでいっぱいになる可能性があります。完全な説明については、ここをクリックしてください

更新:厳密に制御されたシナリオでも、これは、値型プロパティのみ(string、intなど)を持つフラットオブジェクト以外のものに対して、(私が今持っているような)無限の頭痛を引き起こす可能性があります。単一のdb4o接続でオブジェクトを取得、編集、保存するようにコードを設計できない限り、db4oをまったく使用しないことをお勧めします。

Person person = new Person() { FirstName = "Charles", LastName = "The Second" };
Db4oUUID uuid;

using (IObjectContainer client = server.OpenClient())
{
    // Store the new object for the first time
    client.Store(person);

    // Keep the UUID for later use
    uuid = client.Ext().GetObjectInfo(person).GetUUID();
}

// Guy changed his name, it happens
person.FirstName = "Lil' Charlie";

using (var client = server.OpenClient())
{
    // Get a reference only (not data) to the stored object (server round trip, but lightweight)
    Person inactiveReference = (Person) client.Ext().GetByUUID(uuid);

    // Get the temp ID for this object within this client session
    long tempID = client.Ext().GetID(inactiveReference);

    // Replace the object the temp ID points to
    client.Ext().Bind(person, tempID);

    // Replace the stored object
    client.Store(person);
}
于 2011-05-03T09:10:10.670 に答える