GUID 00000000-0000-0000-0000-000000000000导致合并索引违规

时间:2011-08-09 18:52:14

标签: sql-server-2008 linq-to-sql merge-replication

我们的开发人员有一个与我的数据库对话的linq-2-sql项目。数据库涉及合并复制。它已经使用了一段时间,并且工作正常。最近的一个表被添加到模式中,现在在添加新记录时会引起问题。

用户收到一条错误消息,指出与合并复制自动创建的guid相关的索引违反了唯一约束。

据我所知,该表与其他参与者没有任何不同。我已经从头开始重新创建了整个复制发布/订阅模型,一切都继续工作,但只有一个表。

有人有什么想法吗?正在创建的guid显示为00000000-0000-0000-0000-000000000000,这可以解释为什么它是重复的。为什么linq没有创建有效的guid?

4 个答案:

答案 0 :(得分:11)

当您的意思是“Guid.NewGuid()”时,您是否在代码库中的某处使用了“new Guid()”?

答案 1 :(得分:2)

使用Linq-To-SQL时,请确保IsDbGenerated property为true且数据库实际设置为创建ID(使用newid()作为默认值)。

否则,请确保.net代码实际上是在生成ID。

答案 2 :(得分:2)

我遇到过类似的问题。正如Mark在评论中提到的那样,需要正确使用Guid()。

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

改为使用

Guid asm = Guid.NewGuid();

答案 3 :(得分:2)

我们在研究您的建议时发现,这个特定的表是DBML类中唯一包含guid字段的表。在发布用于合并复制的数据库之前,所有其他表都已添加到DBML中(因此它们各自的guid字段未包含在DBML中)。

因此,我手动删除了DBML 中问题表中的guid字段,问题就消失了。问题实际上是LINQ没有在生成的类中创建guid引起的。

在这种情况下,最简单的方法就是将guid创建简单地保留到SQL中建立的发布触发器和newid()默认值。 (它仍在数据库中,而不是dbml)

应用程序中没有任何东西使用那些guid字段......它纯粹是为了管理我们实现的合并复制方案 - 所以从DBML中删除是最简单的。