7

PK として GUID を持つマージ レプリケーション スキームの一部であるデータベースがあります。具体的には、データ型はuniqueidentifier、デフォルト値(newsequentialid())、RowGUID はYesに設定されています。InsertOnSubmit(CaseNote) を実行すると、CaseNoteID をそのままにしておくことができると思い、MSSMS で新しい行を手動で入力した場合と同様に、データベースは次の Sequential GUID を入力します。代わりに、00000000-0000-0000-0000-000000000000を送信します。を追加CaseNoteID = Guid.NewGuid(),すると、GUID は取得されますが、シーケンシャルは取得されません (確信しています)。

LINQ InsertOnSubmit() で SQL に次のシーケンシャル ID を作成させる方法はありますか?

以下は、データベースに新しいレコードを挿入するために使用しているコードです。

            CaseNote caseNote = new CaseNote
                                {
                                    CaseNoteID = Guid.NewGuid(),
                                    TimeSpentUnits = Convert.ToDecimal(tbxTimeSpentUnits.Text),
                                    IsCaseLog = chkIsCaseLog.Checked,
                                    ContactDate = Convert.ToDateTime(datContactDate.Text),
                                    ContactDetails = memContactDetails.Text
                                };
        caseNotesDB.CaseNotes.InsertOnSubmit(caseNote);

        caseNotesDB.SubmitChanges();

以下の提案の 1 つに基づいて、その列の LINQ で自動生成を有効にしましたが、次のエラーが表示されます -->ステートメントに INTO 句のない OUTPUT 句が含まれている場合、DML ステートメントのターゲット テーブルには有効なトリガーを含めることができません。 アイデア?

4

7 に答える 7

5

Linq to Sqlデザイナで、その列のAutoGeneratedValueプロパティをtrueに設定します。

これは、列のIsDbGeneratedプロパティと同等です。唯一の制限は、Linqを使用して値を更新できないことです。

于 2009-04-15T18:17:44.100 に答える
5

右側の[関連]ボックスの上部から:

Linq-to-SqlのシーケンシャルGUID?

本当に「次の」値が必要な場合は、GUIDの代わりにint64を使用してください。COMB GUIDは、GUIDが順序付けられていることを確認します。

于 2009-04-15T18:17:48.220 に答える
1

あなたは本当にいくつかのことをする必要がありました。

  1. GUID タイプ プロパティへの割り当てを削除します。
  2. 列を自動生成に変更します
  3. データベースに制約を作成して、列のデフォルトを NEWSEQUENTIALID() にします
  4. 以前と同じように、送信時に挿入します。

テーブルへの挿入時に、ID が作成され、シーケンシャルになります。 NEWSEQUENTIALID() と他のメソッドのパフォーマンス比較

于 2010-07-15T12:47:33.143 に答える
1

「ステートメントに INTO 句のない OUTPUT 句が含まれている場合、DML ステートメントのターゲット テーブルに有効なトリガーを含めることはできません」に関しては、この MS KB 記事を確認してください。LINQ のバグのようです。

http://support.microsoft.com/kb/961073

于 2009-07-31T20:46:41.223 に答える
0

Masstransitはcombguidを使用します:

https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit/NewId/NewId.cs

これはあなたが探しているものですか?

ウィキペディアから:

シーケンシャルアルゴリズム

GUIDは通常、データベーステーブルの主キーとして使用されます。これにより、多くの場合、テーブルにはその属性のクラスター化インデックスがあります。これは、レコードを挿入するときにパフォーマンスの問題を引き起こします。これは、完全にランダムなGUIDは、レコードをテーブルの最後の近くに単に追加するのではなく、テーブル内のどこかに挿入する必要があることを意味するためです。重複する番号の衝突を効果的に防ぐのに十分なランダム性を提供しながら、この問題を軽減する方法として、いくつかのアルゴリズムを使用して順次GUIDを生成しました。2002年8月にJimmyNilssonによって記述され[7]、「COMB」(「複合GUID /タイムスタンプ」)と呼ばれる最初の手法は、Data4の最後の6バイトを現在のシステム日付の最下位6バイトに置き換えます。 /時間。これにより、同じ数分の1秒以内に順序が狂って生成されるGUIDが発生する可能性がありますが、彼のテストでは、これが挿入に実際の影響をほとんど与えないことが示されました。このアプローチの1つの副作用は、必要に応じて、挿入の日付と時刻を後で値から簡単に抽出できることです。Microsoft SQL Serverバージョン2005以降、MicrosoftはTransact-SQL言語にNEWSEQUENTIALID()[8]という関数を追加しました。この関数は、値が増加することが保証されているGUIDを生成しますが、サーバーが再起動します。これにより、挿入が発生する可能性のあるデータベーステーブルページの数が減りますが、値が常に増加することを保証するものではありません。この関数によって返される値は簡単に予測できますが、したがって、このアルゴリズムは、セキュリティやハッシュの目的であいまいな数値を生成するのには適していません。2006年に、プログラマーはOracleが提供するSYS_GUID関数が一部のプラットフォームでシーケンシャルGUIDを返すことを発見しましたが、これは機能ではなくバグのようです。[9]

于 2012-05-25T09:38:16.667 に答える
0

自動生成された (guid/シーケンシャル guid) 主キーを使用し、テーブルにトリガーがある場合、Linq2Sql にバグがあります。それがエラーの原因です。この問題に対する修正プログラムがあります。

http://support.microsoft.com/default.aspx?scid=kb;en-us;961073&sd=rss&spid=2855

于 2010-02-05T19:52:41.630 に答える