0

uniqueidentifier 型の既存の SQL テーブルに列を追加しようとしています。その列は null であってはならず、もちろん一意であってはなりません。私はこのコードを試みました:

ALTER TABLE ScheduleJobs ADD CurrentInstanceID uniqueidentifier not null

に続く:

ALTER TABLE ScheduleJobs ADD CONSTRAINT DF_CurrentInstanceID DEFAULT newsequentialid() FOR CurrentInstanceID

ただし、(C# から) 新しいレコードを作成すると、uniqueidentifier は常にすべてゼロ (おそらく null) になります。重複する GUID が作成される可能性があります。私の測定値に基づくと、これは非常にまれなケースであるように見えますが、何らかの潜在的なエラーが浮かんでいるのは常に悪い習慣のようです. フィールドはテーブルの PK ではないことに注意してください。教育のために、提案や意見を歓迎します。

MS SQL SERVER 2008 で C# 4.0 フレームワークを使用しています

4

4 に答える 4

3

遅れて申し訳ありませんが、この問題が解決されたことを嬉しく思います。皆様の圧倒的なご支援に感謝いたします。誰も頭に釘を打ったわけではありませんが (そして、いくつかの本当に良い提案がありました)、Eldog は彼のコメントで Entity Framework が適切に機能していないことを指摘しました。彼のおかげで、私は単純に Entity Framework + GUID をググって解決策を見つけました。

この記事では、問題を順を追って説明し、問題、解決策、解決手順について詳しく説明します。一度に 1 つのステップを実行してテストすることにしたこと、および最後のステップを実行する必要がないことに注意してください。これにより、Entity Framework の以降のバージョンで問題の一部が解決された可能性があると思われます。

デザイン ビュー (xml ではなく) で edmx ファイルを取得し、StoreGeneratedPatternプロパティを "Identity" に設定しただけです。

助けと提案をありがとう。あなたは素晴らしい集団です。

于 2013-07-05T20:21:14.643 に答える
2

C# コードは、レコードの作成時に CurrentInstanceID を渡そうとしますか? もしそうなら、INSERT ステートメントからその列を削除できますか?

これは数値の主​​キーで行います。C# コードは、レコードに対する CRUD 操作のストアド プロシージャを呼び出します。C# コードは、独自に使用するためにクライアント側で負のキーを生成します。レコードを作成する準備ができたら、このキーをストアド プロシージャに渡します。

proc はこのキーを無視し、残りのデータを挿入します。proc の出力は、SQL がレコードに割り当てた実際のキーです。最後に、C# コードは新しいキーを既存のデータにマージします。

于 2013-07-05T15:12:03.773 に答える
0

これには GUID を使用しません。GUID は Windows で非常に多くの操作で使用されるため、これはアプリケーションでのみ一意になる識別子ではなく、オペレーティング システムで一意の識別子になります。これがあなたの場合に意味をなさない限り、私はそれを使用しません。

単純な のように増分値を使用できますuint。テーブルに既にいくつかのデータがある場合は、既存の行に新しい列の増分値を入力するスクリプトを作成し、そのスクリプトの実行後に一意の制約を列に追加できます。

于 2013-07-05T15:07:27.767 に答える
0

元の Create table または alter table では、次のようなものを使用します

create table ScheduleJobs (keyval int, id2 uniqueidentifier not null default newsequentialid())

次に、挿入で列を参照しないでください。新しい GUID 値が追加されます

于 2013-07-05T15:10:27.013 に答える