Pregunta

Estoy tratando de guardar un nuevo objeto en la base de datos usando Petapoco. Tengo un objeto que usa un GUID para la clave principal.

Aquí hay un ejemplo de la propiedad de clave principal de objetos.

<PetaPoco.Column()> _
Public ReadOnly Property Primkey() As Guid Implements IStandardDocument.Primkey
    Get
        Return (_primkey)
    End Get
End Property

Aquí hay un ejemplo del método de guardado.

database.Save("Reservations", "Primkey", reservation)

El SQL que se genera es una actualización con una primla de 00000000-0000-0000-0000-00000000000000 en lugar de un inserto. Entonces nunca se insertan nuevos registros.

Si tengo un objeto existente con un GUID válido, la actualización y eliminar todo el trabajo correctamente.

¿Qué estoy haciendo mal para el caso de guardado?

¿Fue útil?

Solución 2

Pude hacer que esto funcione eliminando el tipo de la propiedad Primkey. Establecer el Primkey en NULL ahora devolverá nulo en lugar de un guía vacío.

Petapoco ahora ve que el campo PrimaryKey es un nulo y genera la declaración de inserción correcta en lugar de generar una declaración de actualización para Primey 0000000000-0000-0000-0000-00000000000000.

Otros consejos

Lo más probable es que sea demasiado tarde para responder esto para el póster original, pero para otros ... mi entendimiento es que la guardada no funciona para las columnas GUID. La forma en que Petapoco sabe si es una actualización Insert vs es si el valor clave es diferente del valor predeterminado. En caso de que Numérico fuera 0, en el caso de GUID, sería '00000000-0000-0000-0000-00000000000000'. Aquí hay un extracto del método ISNEW

// Common primary key types
            if (type == typeof(long))
                return (long)pk == 0;
            else if (type == typeof(ulong))
                return (ulong)pk == 0;
            else if (type == typeof(int))
                return (int)pk == 0;
            else if (type == typeof(uint))
                return (uint)pk == 0;
// Create a default instance and compare
return pk == Activator.CreateInstance(pk.GetType());

En el caso de GUID, la última declaración siempre devolvería falso, incluso si su clave principal es todo ceros. Realmente debería haber otro otro si como tal:

else if (type == typeof(Guid))
                return Guid.Equals(pk, Activator.CreateInstance(pk.GetType()));

Sin embargo, no verifiqué si esto es lo único que debe cambiarse para la clave GUID para trabajar. Después de insertar el registro, Petapoco intenta verificar el valor clave del registro recién insertado y también podría fallar en eso.

Nunca he trabajado con Petapoco, pero algunas cosas que intentaría primero son:-

  1. El tipo de datos de la columna de Primkey en SQL es 'UniqueIdentifier'
  2. El valor predeterminado de la columna de Primkey es (newid ())
  3. Cambie el Primkey a un valor get/set y haga 'primkey = guía.newguid' antes de guardar.

EDITAR: Simplemente pensé, cuando declaras una nueva reserva, ¿te permite pasar una identificación en el constructor?

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