2012-02-22 18 views
0

Visual Studioデータベースダイアグラムエディタでデータベース設計を作成し、そこからすべてのテーブルを作成しました。また、Linq to SQLクラスを作成し、テーブルを追加して各テーブルのオブジェクトを作成しました。私はデータベースに新しいエントリを挿入しようとするときに問題に遭遇しています。例えばLinqでSQLにリレーショナルデータを挿入すると、重複エントリエラーが発生する

のは、私は2つのテーブル、アーティストやアルバムを持っているとしましょう。 1人のアーティストが複数のアルバム(1対多)を持つことができます。アルバムにはArtistIDフィールドがあります。このフィールドはArtistテーブルのArtistID PKまでのFKです。それらのIDは、データベースによって自動的に生成されるGUIDです。

は今、私のコードで私は(myAlbumと呼ばれる)の新しいアルバムのオブジェクトを作成し、データベース(myArtist)に既にあるアーティストにそのアーティストのオブジェクトを設定します。

私はこのような何か場合:

DatabaseDataContext context = new DatabaseDataContext(); 
context.Albums.InsertOnSubmit(myAlbum); 
context.SubmitChanges(); 

を私は言ってSqlExceptionがなってしまう:「PRIMARY KEY制約の違反 『をPK_Artist』オブジェクトに重複するキーを挿入できません 『dbo.Artist』 。ステートメントが終了しました。

私は、データベースにすでにアーティストにmyAlbum.Artist比較する場合、LINQのは、それらが等しいと言うので、それは彼らが同じオブジェクトである知っています。

はどうすればLINQのは、新しいアルバムのオブジェクトを挿入して、再度のアーティストを挿入しようとせずに、既にデータベース内の既存のアーティストにそれをリンクするのですか?

+0

pk_Artist列のデータ型とは何ですか? –

+0

またGUIDです。 – nguyer

+0

アーティストを設定した場所にコードを投稿できますか? – Paddy

答えて

0

重複する主キーがGUID.Emptyである可能性があります。私の理解が正しいなら。

私はこの問題の解決策を考えています。 pk_artist列の

セットのデフォルト値はnewid()されるように。これにより、プライマリKerrが自動的に生成されます。

または

エンティティに主キーを明示的に割り当てます。

myAlbum.Pk_Artist = GUID.NewGiud(); 
context.Albums.InsertOnSubmit(myAlbum); 

・ホープ、このヘルプ

+0

実際、pk_artiのデフォルト値はすでにnewid()に設定されており、DBによって自動的に生成されるように設定されています。 – nguyer

0

はどうやら、あなたは他のDataContextのインスタンスにフェッチされたオブジェクトとアルバムのArtistプロパティを設定します。したがって、あなたの新しいDatabaseDataContextはアーティストを挿入する必要があると「考える」。

あなたはどちらかAlbum.ArtistId(ないアーティストオブジェクト)を設定、または同じデータコンテキストでアーティストをフェッチし、そのアルバムコレクションにアルバムを追加することができます。

ところで、using (var context = new DatabaseDataContext()) { ... }が良いです。

+0

ああ!私はあなたが何かに乗っているかもしれないと思う。あなたはデータ・コンテキスト内でArtistオブジェクトを作成しなかったという点で正しいです。これは私のテーブルの一部です(単純化のため)。実際には、データベースに挿入する前に、このように大きなオブジェクト関係を構築します。 Linqにすでにデータベースに存在するオブジェクトを「一致させる」方法はありますか? – nguyer

+0

ほとんどありません。 [Attachメソッド](http://msdn.microsoft.com/en-us/library/bb548978.aspx)を参照してください。私はあなたのシナリオがそこに記載された条件と一致したとは思わない。 1つのDataContextの範囲内ですべてを行うのが良いか、Idで作業する方がよいでしょう。 –

+0

OK。明らかに私はそれ以上の研究をしています。ご協力ありがとうございます!あなたは私を正しい道につかんだと思うよ! – nguyer

0

最初に重複した主キーを解決する必要があります。私のテストでは、主キーがUNIQUEIDENTIFIERで、デフォルト値が(newid())であるプライマリテーブルを作成しました。

次に、あなたのテーブルをLinq To SQLクラスプロジェクトにドラッグすると、テーブルクラスがあなたが望むものすべてで作成されます:主キー列のAuto Generate Valuesはtrueに設定されていますが、そうではありません!列のデータ型がUNIQUEIDENTIFIERの場合、既定ではfalseになります。 それから、私はMS SQLに列を落として、INTのデータ型をLinq to SQLクラスにドラッグしてそれを再作成し、次に列のプロパティーAuto Generate Valuesをtrueに設定しました。

UNIQUEIDENTIFIERを使用する場合は、Auto Generate Valuesプロパティをtrueに手動で設定する必要があります。

関連する問題