我正在尝试使用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的现有对象,则更新并删除所有工作正确。
我在保存案例中做错了什么?
答案 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,但我会首先尝试的一些事情是: -