2011-08-09 46 views
2

我们的开发人员有一个与我的数据库交谈的linq-2-sql项目。数据库涉及合并复制。它已经使用了一段时间,并且工作正常。最近的一张表被添加到模式中,并且现在在添加新记录时导致问题。导致合并索引违规的00000000-0000-0000-0000-000000000000的GUID

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

从我能告诉表中没有任何不同于其他参与者。我从零开始重新创建了整个复制发布/订阅模型,并且所有内容都可以继续工作,但只有一张表。

任何人有任何想法?被创建的guid显示为00000000-0000-0000-0000-000000000000,这可以解释为什么它是重复的。为什么一个有效的guid不是由linq创建的?

+1

当你的意思是“Guid.NewGuid()”时,你是否在代码库的某处使用了“新的Guid()”? – MarkPflug

+0

@Mark您应该发表您的评论作为答案,因为这可能是问题的原因。 – Donut

+0

+1给你所有的答案...他们带我到解决方案的工作。 – RThomas

回答

9

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

+0

我正在将你的标记为正确,因为它是...但也看到我的答案。我们解决这个问题的方式是彻底删除DBML中的guid字段,并将其全部留给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字段,问题就消失了。这个问题实际上是由于LINQ没有创建GUID,因为它应该在生成的类中生成。

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

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