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 は、挿入の代わりに 00000000-0000-0000-0000-000000000000 の primkey を使用した更新です。したがって、新しいレコードが挿入されることはありません。

有効な GUID を持つ既存のオブジェクトがある場合、更新と削除はすべて正しく機能します。

セーブケースで何が間違っていますか?

4

3 に答える 3

2

元のポスターについてこれに答えるには遅すぎる可能性がありますが、他の人にとっては... 私の理解では、保存は 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 に設定すると、空の GUID ではなく null が返されるようになりました。

PetaPoco は、primarykey フィールドが null であることを認識し、primkey 00000000-0000-0000-0000-000000000000 の更新ステートメントを生成するのではなく、正しい挿入ステートメントを生成するようになりました。

于 2012-01-20T08:00:17.817 に答える
0

私はペタポコを使ったことはありませんが、最初に試してみたいことは次のとおりです。

  1. SQLのPrimkey列のデータ型は「Uniqueidentifier」です
  2. Primkey カラムのデフォルト値は (newid()) です
  3. PrimKey を Get/Set 値に変更し、保存する前に「Primkey = Guid.NewGuid」を実行します。

編集: 新しい予約を宣言すると、コンストラクターに ID ect を渡すことができると思いましたか?

于 2012-01-16T12:21:52.053 に答える