あるdb4oセッションでオブジェクトを取得し、別のdb4oセッションで保存します(「切断されたシナリオ」)

StackOverflow https://stackoverflow.com/questions/5848990

質問

私は、DB4Oでのクライアントセッション間でオブジェクトを使用可能に保つ方法を見つけようとしています。私が理解していることから、クライアントセッションが閉じられると、オブジェクトはキャッシュに存在しなくなり、有効なUUIDがあるという事実にもかかわらず、重複を挿入せずにコールすることはできません。私はそれを手動でキャッシュに再び添付する方法を検索しましたが、そのようなメカニズムはありません。それを再retrifeすることで、私は現在役に立たないオブジェクトからすべての値をコピーするように強制されます。

これがコードの上記の段落です:

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)を介して、これらのシナリオをサポートしています。

何かご意見は?

役に立ちましたか?

解決 2

さて、db4o iextcontainer.bind()メソッドについてのGamlorの応答により、ソリューションを指摘しました。このソリューションは、DBへのアクセスが厳しく制御され、外部クエリがオブジェクトインスタンスを取得できない非常に特定の状況でのみ有効であることに注意してください。

警告:このソリューションは危険です. 。データベースは、オブジェクトを置き換えて値を更新せず、したがって参照を破壊するため、あらゆる種類の複製オブジェクトでデータベースを埋めることができます。 完全な説明については、ここをクリックしてください.

アップデート: :緊密に制御されたシナリオであっても、これにより、値型プロパティのみ(String、Intなど)を持つフラットオブジェクト以外のものに対して、これは無限の頭痛(私が現在持っているような)を引き起こす可能性があります。コードを設計して1つの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);
}

他のヒント

この機能は、DB4O = (。。DB4Oが多くのシナリオで使用が非常に困難になるようになります。

基本的に、すべての属性に対処することにより、独自のReattachメソッドを作成する必要があります。 Automapperのようなライブラリが役立つかもしれませんが、最終的には自分でやらなければなりません。

別の質問は、DB4O UUIDを使用してオブジェクトを識別するかどうかです。 DB4O UUIDは巨大であり、よく知られているタイプではありません。私は個人的には通常の.NETガイドを好むでしょう。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top