我正在尝试使用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,但我会先尝试以下几件事:-
- sql中Primkey列的数据类型为"唯一标识符"
- Primkey列的默认值为(newid())
- 将PrimKey更改为Get/Set值,并在保存前执行"PrimKey=Guid.NewGuid"
编辑:我只是想,当你声明一个新保留时,它允许你在构造函数上传递一个ID ect吗?