使用空guid保存新对象PetaPoco无法执行插入操作



我正在尝试使用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是一个更新,其primkey为00000000-0000-0000-0000-000000000,而不是插入。因此,永远不会插入新记录。

如果我有一个具有有效guid的现有对象,则更新和删除所有对象都能正常工作。

我在保存案例中做错了什么?

对于最初的海报来说,回答这个问题很可能为时已晚,但对于其他人来说。。。我的理解是保存不适用于Guid列。petaPoco知道这是插入还是更新的方法是键值是否与默认值不同。如果是数字,则为0,如果是Guid,则为"00000000-0000-0000-0000-000000000000000"。以下是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尝试检查新插入记录的键值,但可能也会失败。

我能够通过从primkey属性中删除类型来实现这一点。将primkey设置为null现在将返回null,而不是空的guid。

PetaPoco现在看到primarykey字段为null,并生成正确的插入语句,而不是为primarykey 00000000-0000-0000-0000-000000000生成更新语句。

我从未使用过petapoco,但我会先尝试以下几件事:-

  1. sql中Primkey列的数据类型为"唯一标识符"
  2. Primkey列的默认值为(newid())
  3. 将PrimKey更改为Get/Set值,并在保存前执行"PrimKey=Guid.NewGuid"

编辑:我只是想,当你声明一个新保留时,它允许你在构造函数上传递一个ID ect吗?

相关内容

  • 没有找到相关文章

最新更新