Pregunta

Estoy tratando de descubrir cómo mantener un objeto utilizable entre las sesiones de clientes en DB4O. Por lo que entiendo, una vez que se cierra la sesión de un cliente, el objeto ya no reside en ningún caché y, a pesar del hecho de que tengo un UUID válido, no puedo llamar a la tienda sin causar que se inserte un duplicado. Busqué una forma de volver a agregarlo manualmente al caché, pero no existe tal mecanismo. Re-retrieving It It foro me obligará a copiar todos los valores del objeto ahora inútil.

Aquí está el párrafo anterior en código:

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
}

La última versión de Eloquera admite estos escenarios, ya sea a través de un atributo [ID] o a través de la tienda (UID, objeto).

¿Alguna idea?

¿Fue útil?

Solución 2

De acuerdo, la respuesta de Gamlor sobre el método db4o iextContainer.bind () me señaló a la solución. Tenga en cuenta que esta solución solo es válida en situaciones muy específicas en las que el acceso al DB está estrechamente controlado, y ninguna consulta externa puede recuperar instancias de objetos.

Advertencia: esta solución es peligrosa. Puede llenar su base de datos con todo tipo de duplicados y objetos basura, porque reemplaza el objeto y no actualiza sus valores, por lo tanto, rompiendo ninguna referencia a él. Haga clic aquí para obtener una explicación completa.

ACTUALIZAR: Incluso en escenarios bien controlados, esto puede causar dolores de cabeza interminables (como el que tengo ahora) para cualquier otra cosa que no sea un objeto plano con propiedades de tipo de valor (String, int, etc.). A menos que pueda diseñar su código para recuperar, editar y guardar objetos en una sola conexión DB4O, entonces le recomiendo que no use DB4O en absoluto.

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

Otros consejos

De hecho, esta funcionalidad falta en DB4O = (. Eso hace que DB4O sea muy difícil de usar en muchos escenarios.

Básicamente, debe escribir su propio método Reattach haciendo frente a todos los atributos. Tal vez una biblioteca como Automapper puede ayudar, pero al final tienes que hacerlo tú mismo.

Otra pregunta es si realmente desea usar los uuids DB4O para identificar un objeto. Los uuids DB4O son enormes y no son un tipo bien conocido. Personalmente, preferiría .NET GUIDS regular.

Por cierto: está el método db4o .bind (), que une un objeto a una identificación existente. Sin embargo, apenas hace lo que realmente quieres. Supongo que quieres almacenar cambios hechos en un objeto. Bind básicamente reemplaza el objeto y rompe el gráfico de objeto. Por ejemplo, si tiene objetos parcialmente cargados y luego lo ata, pierde las referencias a los objetos. Entonces .Bind no es utilizable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top