7

我们的开发人员有一个与我的数据库对话的 linq-2-sql 项目。数据库参与合并复制。它已经使用了一段时间并且运行良好。最近的表已添加到架构中,现在在添加新记录时会导致问题。

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

据我所知,这张桌子与所涉及的其他桌子没有任何不同。我已经从头开始重新创建了整个复制发布/订阅模型,并且除了那个表之外一切都继续工作。

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

4

4 回答 4

21

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

于 2011-08-09T18:58:21.637 回答
5

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

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

而是使用

Guid asm = Guid.NewGuid();
于 2011-08-09T19:00:14.553 回答
3

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

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

于 2011-08-09T18:58:36.550 回答
2

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

因此,我从DBML的问题表中手动删除了 guid 字段,问题就消失了。这个问题实际上是由于 LINQ 没有像在生成的类中那样创建 guid。

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

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

于 2011-08-09T20:45:45.253 回答