2011-08-09 21 views
2

私たちの開発者には、私のデータベースと通話するlinq-2-sqlプロジェクトがあります。データベースは、マージレプリケーションに関係しています。それはしばらく使用されており、うまくいきました。最近のテーブルがスキーマに追加され、新しいレコードが追加されたときに問題が発生しています。GUIDが00000000-0000-0000-0000-000000000000のため、マージインデックス違反が発生する

ユーザーは、マージレプリケーションが自動的に作成するGUIDに関連するインデックスが一意制約に違反しているというエラーメッセージを表示します。

テーブルから私が言うことができるものは、関係する他のものと異なるものではありません。レプリケーションパブリケーション/サブスクリプションモデル全体を最初から再作成し、すべてが機能し続けますが、その1つのテーブル。

誰もが考えている?作成されたguidは00000000-0000-0000-0000-000000000000のように表示され、重複する理由を説明します。 linqが有効なGUIDを作成していないのはなぜですか?

+1

「Guid.NewGuid()」を意味するときに、コードベースのどこかに「new Guid()」を使用しましたか? – MarkPflug

+0

@マークこれはおそらく問題の原因であるので、あなたのコメントを回答として投稿するべきです。 – Donut

+0

+1すべてのあなたの答え...彼らは働いた解決策に私を導いた。 – RThomas

答えて

9

「Guid.NewGuid()」を意味するときに、コードベースのどこかに「new Guid()」を使用しましたか?

+0

私はそれが正しいからあなたのものを...とマークしていますが、私の答えも見ています。私たちが対処する方法は、guidフィールドをDBMLから完全に削除し、管理するためにすべてをSQL Serverに残しました。 – RThomas

2

Linq-To-SQLを使用する場合は、IsDbGenerated propertyがtrueで、データベースが実際にIDを作成するように設定されていることを確認してください(newid()をデフォルト値として使用)。

それ以外の場合は、.netコードが実際にIDを生成していることを確認してください。

2

私は同様の問題に直面していました。 Markがコメントで述べたように、Guid()は適切に使用される必要があります。代わりに

Guid asm = new Guid(); // gives 00000000-0000-0000-0000-000000000000 

ご提案を研究しながら、私たちが発見した何

Guid asm = Guid.NewGuid(); 
2

を使用して、この特定のテーブルにはDBMLクラスでまったくGUIDフィールドを含むテーブルだけだったということでした。マージレプリケーションのためにデータベースを公開する前に、他のすべてのテーブルがDBMLに追加されていました(したがって、それぞれのGUIDフィールドはDBMLには含まれていません)。

したがって、DBMLの問題テーブルからguidフィールドを手動で削除してしまい、問題が解決しませんでした。この問題は、生成されたクラスで必要なGUIDを作成しないLINQによって実際に発生していました。

この場合、guidの作成をSQLで確立されたpublicationのtriggersおよびnewid()のデフォルト値のままにするのが最も簡単でした。

アプリケーションの中には、これらのGUIDフィールドを使用しているものはありません...私たちが実装したマージレプリケーションスキームをSQLで管理するのは純粋です.DBMLから削除するのが最も簡単でした(つまり、データベースにはまだありません。 。

関連する問題