Domanda

Sto cercando di salvare un nuovo oggetto nel database usando Petapoco. Ho un oggetto che utilizza un GUID per la chiave primaria.

Ecco un esempio della proprietà chiave primaria degli oggetti.

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

Ecco un esempio del metodo di salvataggio.

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

L'SQL che viene generato è un aggiornamento con un Primkey di 00000000-0000-0000-0000-0000000000000000000000000000000000 di invece di un inserto. Quindi non vengono mai inseriti nuovi record.

Se ho un oggetto esistente con un GUID valido l'aggiornamento ed elimina tutto correttamente.

Cosa sto facendo di sbagliato per il caso di salvataggio?

È stato utile?

Soluzione 2

Sono stato in grado di fare questo lavoro rimuovendo il tipo dalla proprietà Primkey. Impostare il Primkey su Null ora restituirà null anziché un GUID vuoto.

Petapoco ora vede che il campo PrimaryKey è nullo e genera la corretta istruzione Insert anziché generare una dichiarazione di aggiornamento per Primkey 00000000-0000-0000-0000-00000000000000.

Altri suggerimenti

Molto probabilmente è troppo tardi per rispondere a questo per il poster originale, ma per gli altri là fuori ... la mia comprensione è che il salvataggio non funziona per le colonne GUID. Il modo in cui Petapoco sa se si tratta di un aggiornamento insert vs è se il valore chiave è diverso da predefinito. Nel caso in cui numerico sarebbe 0, nel caso di GUID sarebbe '00000000-0000-0000-0000-00000000000000'. Ecco un estratto di metodo 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());

Nel caso di GUID, l'ultima affermazione restituirebbe sempre false, anche se la chiave primaria è tutta zeri. Dovrebbe esserci davvero un altro altro se come tale:

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

Tuttavia, non ho verificato se questa è l'unica cosa che deve essere cambiata per la chiave di guida al lavoro. Dopo aver inserito il record, Petapoco cerca di verificare il valore chiave del record appena inserito e potrebbe fallire anche su questo.

Non ho mai lavorato con Petapoco, ma alcune cose che proverei per prime sono:-

  1. Il tipo di dati di Primkey Column in SQL è "Unique Identifier"
  2. Il valore predefinito della colonna Primkey è (newId ())
  3. Cambia il Primkey in un valore Get/SET e fai 'Primkey = Guid.NewGuid' prima di salvare.

EDIT: ho appena pensato, quando dichiari una nuova prenotazione ti permette di passare un id ect sul costruttore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top