1

我正在尝试使用 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-000000000000 而不是插入的更新。所以永远不会插入新记录。

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

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

4

3 回答 3

2

对于原始海报来说,回答这个问题很可能为时已晚,但对于其他人来说......我的理解是 Save 不适用于 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 会尝试检查新插入记录的键值,它也可能会失败。

于 2012-03-08T00:21:12.243 回答
1

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

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

于 2012-01-20T08:00:17.817 回答
0

我从未与 petapoco 合作过,但我首先要尝试的几件事是:-

  1. sql中Primkey列的数据类型是'Uniqueidentifier'
  2. Primkey 列的默认值为 (newid())
  3. 将 PrimKey 更改为 Get/Set 值并在保存前执行“Primkey = Guid.NewGuid”。

编辑:我只是想,当您声明一个 New Reservation 时,它是否允许您在构造函数上传递一个 ID 等?

于 2012-01-16T12:21:52.053 回答