Abrufen Sie ein Objekt in einer DB4O -Sitzung ab und speichern in einer anderen ("getrenntes Szenario").

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

Frage

Ich versuche herauszufinden, wie ein Objekt zwischen Client -Sitzungen in DB4O verwendet werden kann. Soweit ich weiß, liegt das Objekt nach Abschluss einer Client -Sitzung nicht mehr in einem Cache und trotz der Tatsache, dass ich ein gültiges UUID habe, kann ich nicht ein Laden aufrufen, ohne ein Duplikat einzufügen. Ich habe nach einer Möglichkeit gesucht, ihn manuell dem Cache neu zu nutzen, aber es gibt keinen solchen Mechanismus. Neuauflagerung wird mich dazu zwingen, alle Werte aus dem jetzt nutzlosen Objekt zu kopieren.

Hier ist der obige Absatz in Code:

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
}

Die neueste Version von Eloquera unterstützt diese Szenarien entweder über ein [ID] -Triput oder über Store (UID, Objekt).

Irgendwelche Gedanken?

War es hilfreich?

Lösung 2

Okay, Gamlors Antwort auf die DB4O iextcontainer.bind () -Methode hat mich auf die Lösung hingewiesen. Bitte beachten Sie, dass diese Lösung nur in sehr bestimmten Situationen gültig ist, in denen der Zugriff auf die DB fest kontrolliert wird und keine externen Abfragen Objektinstanzen abrufen können.

Warnung: Diese Lösung ist gefährlich. Es kann Ihre Datenbank mit allen Arten von Duplikaten und Junk -Objekten füllen, da sie das Objekt ersetzt und seine Werte nicht aktualisiert, wodurch alle Verweise darauf gebrochen werden. Klicken Sie hier, um eine vollständige Erklärung zu erhalten.

AKTUALISIEREN: Selbst in fest kontrollierten Szenarien kann dies zu endlosen Kopfschmerzen (wie die, die ich jetzt habe) für etwas anderes als ein flaches Objekt mit Werttyp -Eigenschaften (String, int usw.) verursachen. Es sei denn, Sie können Ihren Code zum Abrufen, Bearbeiten und Speichern von Objekten in einer einzelnen DB4O -Verbindung entwerfen, dann empfehle ich, DB4O überhaupt nicht zu verwenden.

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);
}

Andere Tipps

Diese Funktionalität fehlt in DB4O = (. Dab4O ist in vielen Szenarien sehr schwierig.

Sie müssen im Grunde Ihre eigene Reattach -Methode schreiben, indem Sie alle Attribute überschreiten. Vielleicht kann eine Bibliothek wie Automapper helfen, aber am Ende müssen Sie es selbst tun.

Eine andere Frage ist, ob Sie wirklich die DB4O -UUIDs verwenden möchten, um ein Objekt zu identifizieren. DB4O -UUIDs sind riesig und kein bekannter Typ. Ich persönlich würde regelmäßige .NET -Guids bevorzugen.

Übrigens: Es gibt die DB4O .bind () -Methode, die ein Objekt an eine vorhandene ID bindet. Es tut jedoch kaum, was Sie wirklich wollen. Ich denke, Sie möchten Änderungen an einem Objekt speichern. Binden Sie das Objekt im Grunde genommen und zerbricht das Objektdiagramm. Wenn Sie beispielsweise teilweise geladene Objekte haben und sie dann binden, verlieren Sie Verweise auf Objekte. So ist Bind nicht verwendbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top