使用空guid保存新对象PetaPoco无法插入

时间:2012-01-16 09:40:03

标签: sql-server vb.net 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是更新,其prkeykey为00000000-0000-0000-0000-000000000000而不是insert。所以永远不会插入新记录。

如果我有一个带有有效guid的现有对象,则更新并删除所有工作正确。

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

3 个答案:

答案 0 :(得分:2)

最有可能为原始海报回答这个问题为时已晚,但对于其他人来说...... 我的理解是保存不适用于Guid专栏。 petaPoco知道它是否是插入vs更新的方式是键值是否与默认值不同。如果是数字,它将是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 :(得分:1)

我能够通过从primkey属性中删除类型来完成这项工作。 将primkey设置为null现在将返回null而不是空guid。

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

答案 2 :(得分:0)

我从未使用petapoco,但我会首先尝试的一些事情是: -

  1. Primkey列在sql中的数据类型是'Uniqueidentifier'
  2. Primkey列的默认值为(newid())
  3. 将PrimKey更改为Get / Set值,并在保存之前执行'Primkey = Guid.NewGuid'。
  4. 编辑:我只是想,当你宣布一个新的预订时,它是否允许你在构造函数上传递ID?