При сохранении нового объекта с пустым guid PetaPoco не может выполнить вставку - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь сохранить новый объект в базе данных, используя petapoco. У меня есть объект, который использует Guid для первичного ключа.

Вот пример свойства первичного ключа объектов.

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

Вот пример метода сохранения.

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

Сгенерированный sql-файл представляет собой обновление с ключом 00000000-0000-0000-0000-000000000000 вместо вставки. Поэтому новые записи никогда не вставляются.

Если у меня есть существующий объект с действующим guid, обновите и удалите все работы правильно.

Что я делаю не так в случае сохранения?

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Скорее всего, уже слишком поздно, чтобы ответить на этот вопрос для оригинального плаката, но для других там ... Насколько я понимаю, сохранение не работает для столбцов Guid. PetaPoco знает, является ли это вставкой, а не обновлением, если значение ключа отличается от значения по умолчанию. В случае, если числовой это будет 0, в случае Guid это будет «00000000-0000-0000-0000-000000000000». Вот выдержка из метода 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());

В случае Guid последний оператор всегда будет возвращать false, даже если ваш первичный ключ - все нули. Там действительно должно быть другое, если так:

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

Однако я не проверял, нужно ли менять это единственное, чтобы работал ключ GUID. После вставки записи PetaPoco пытается проверить значение ключа для вновь вставленной записи, что может привести к сбою.

1 голос
/ 20 января 2012

Я смог сделать эту работу, удалив тип из свойства primkey.Установка для primkey значения null теперь будет возвращать null, а не пустой guid.

PetaPoco теперь видит, что поле primarykey является нулевым, и генерирует правильный оператор вставки, а не генерирует оператор обновления для primkey 00000000-0000-0000-0000-000000000000.

0 голосов
/ 16 января 2012

Я никогда не работал с petapoco, но несколько вещей, которые я бы попробовал сначала: -

  1. Тип данных столбца Primkey в sql: «Уникальный идентификатор»
  2. Значение по умолчанию для столбца Primkey (newid ())
  3. Измените PrimKey на значение Get / Set и перед сохранением сделайте 'Primkey = Guid.NewGuid'.

РЕДАКТИРОВАТЬ: Я просто подумал, когда вы объявляете новое резервирование, это позволяет вам передать идентификатор ect на конструктор?

...