【问题标题】:GUID of 00000000-0000-0000-0000-000000000000 causing merge index violation00000000-0000-0000-0000-000000000000 的 GUID 导致合并索引冲突
【发布时间】:2011-10-23 12:02:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 当您的意思是“Guid.NewGuid()”时,您是否在代码库的某处使用了“new Guid()”?
  • @Mark 你应该发表你的评论作为答案,因为这可能是问题的原因。
  • +1 对你所有的答案......他们引导我找到了有效的解决方案。

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


【解决方案1】:

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

【讨论】:

  • 我将您的标记为正确,因为它是......但也请参阅我的答案。我们解决这个问题的方法是从 DBML 中完全删除 guid 字段,并将其全部交给 SQL Server 来管理。
【解决方案2】:

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

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

改为使用

Guid asm = Guid.NewGuid();

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-07
        • 2021-07-29
        • 1970-01-01
        相关资源
        最近更新 更多