2012-03-16 27 views
4

私はLINQ to SQLオブジェクトをプログラムで作成して埋め込み、それをPKのuniqueidentifierカラムを持つSQLサーバデータベースに追加します。 LINQは自動的にすべての0のPKを割り当てます。 PKが重複しているため、挿入時にエラーが発生します。LinqがGUIDを追加しないようにして、SQL Serverで実行できるようにするにはどうすればよいですか?

Dim myNewRecord as IceCreamTrackerTable 
myNewRecord.name=Bob 
myNewRecord.favoriteIceCream=Vanilla 
    'myNewRecord.PK=00000000-0000-0000-0000-000000000000 (by default)' 
myDataContext.IceCreamTrackerTables.insertOnSubmit(myNewRecord) 
    ''second record added throws an error because it also has PK 00000 etc. 
  1. 私はmyNewRecord.pk = Guid.newGuid() Guid is all 0's (zeros)?
  2. を使用してPKを割り当てることができることを知っている。しかし、私はだから私が本当にしたいことはGUIDを割り当てるべきSQLサーバー用ですそれはそれは同じGUID

再割り当て私はGUIDを自分で記入したいが、SQLサーバーにそれを残していないことをLINQを伝えるためにどのような方法がありますされていないことを確認するために、いくつかの方法を持っていると仮定?

答えて

3

のGuidのは、このように、彼らはnullにすることはできません、値型です。これは、Guidが作成されたときに、デフォルト値(すべて0)を割り当てる必要があることを意味します。 SQL Serverは、ID列の場合と同様に、主キーのGUIDを自動的に生成しません。デフォルト値をNEWID()に設定できますが、デフォルトではEFはそれを無視して値を挿入しようとします。ここ

http://softmindit.blogspot.com/p/using-guid-as-entitykey-in-entity.html

EDITを説明したように、あなたが何かをすることによって、これをオーバーライドすることができます:私はちょうどあなたがエンティティにないのLINQをLINQ to SQLのを使用している実現します。しかし、私はこれに対処するためにL2Sに似た何かがあると確信しています。

Edit2:linq to sqlには、スクリーンショットに示すようなものがあります。このプロパティを変更すると問題が解決されます。

enter image description here

0

私はそれが 再割り当て同じGUID

GUIDの全体のポイントは...彼らはユニークだということであるかそうでないことを確認するために、いくつかの方法を持っていることを前提としています少なくとも通常はユニークです。あなたがサーバ上でGuid.NewGuid()を呼び出すのと同じソースからすべて割り当てられている場合は、’は、’に衝突してもかなり安全です。

+0

ありがとうございました。私の心配はSQLサーバ上のGUIDであり、Visual StudioのGUIDは「話す」ものではありません。だから、それぞれが指導を割り当てる2つの独立したguidメーカーがあります。私はむしろ、ガイドを作成する責任を担うエンティティを1つだけ持っています。 Visual StudioのGUID作成メソッドは、すでにDBにあるguidを考慮していますか?これは私にはそう思わない。何か不足していますか? – bernie2436

+0

いいえ、それは考慮に入れられませんが、そうする必要はありません。どのプラットフォームやソフトウェアに関係なく、誰がどのように高速に作成しても、重複したGUIDを取得することは理論的に不可能です。 –

+0

@ akh2103 - 特定のマシンで生成されたすべてのGuidは、Visual Studioアプリケーションから呼び出されようと、SQLサーバー内の関数呼び出しからでも、サードパーティのアプリケーションからでも、同じ基礎となるメソッドを呼び出すよう最終的に解決します。私は何が評価されるかの詳細を知らないが、私はそれに現在のタイマーとMACアドレスの数字があると思われる。繰り返しますが、通常はユニークですが、100.00000%であることは保証されていません。しかし、それらがすべて同じソースから生成されている場合は、衝突することはほとんどありません。 –

0

あなたのPKは値タイプのため、は常にに値があります(nullの同等物はありません)。したがって、生成されたクラスに、「手動で」値を設定したかどうかを追跡するための特定の機能が含まれていない場合は、それを省略します。

したがって、IceCreamTrackerTableのソースを見ると、決定的な回答が得られます。

+0

Argh!私は、LINQからsql IceCreamTrackerTableオブジェクトにPKを削除し、送信しようとしたときにこのエラーが発生しました。 'Table(IceCreamTrackerTable)'に作成、更新、または削除操作を実行できません。 – bernie2436

3

あなたはそれがDBはIsDbGeneratedを使用して生成されることを示すために、あなたのGUID列に注釈を付けることができます。

[Column(Storage="_PK", 
     AutoSync=AutoSync.OnInsert, 
     DbType="UniqueIdentifier NOT NULL", 
     IsPrimaryKey=true, IsDbGenerated=true)] 
public Guid PK 
{ 
    //... 
} 
関連する問題