LINQ to SQL插入顺序GUID

时间:2009-04-15 18:12:47

标签: c# linq guid

我有一个数据库是合并复制方案的一部分,它具有GUID,因为它是PK。具体来说,数据类型是 uniqueidentifier ,默认值(newsequentialid()),RowGUID设置为。当我执行InsertOnSubmit(CaseNote)时,我认为我可以单独留下CaseNoteID,并且数据库将输入下一个Sequential GUID,就像在MSSMS中手动输入新行一样。而是发送 00000000-0000-0000-0000-000000000000 。如果我添加CaseNoteID = Guid.NewGuid(),,我会得到一个GUID,但不是一个顺序的(我很确定)。

有没有办法让SQL在LINQ InsertOnSubmit()上创建下一个顺序id?

以下是我用于将新记录插入数据库的代码。

            CaseNote caseNote = new CaseNote
                                {
                                    CaseNoteID = Guid.NewGuid(),
                                    TimeSpentUnits = Convert.ToDecimal(tbxTimeSpentUnits.Text),
                                    IsCaseLog = chkIsCaseLog.Checked,
                                    ContactDate = Convert.ToDateTime(datContactDate.Text),
                                    ContactDetails = memContactDetails.Text
                                };
        caseNotesDB.CaseNotes.InsertOnSubmit(caseNote);

        caseNotesDB.SubmitChanges();

基于以下建议之一,我在该列的LINQ中启用了自动生成,现在我收到以下错误 - > 如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表不能具有任何已启用的触发器。 想法?

7 个答案:

答案 0 :(得分:5)

在Linq to Sql设计器中,为该列设置Auto Generated Value属性为true。

这相当于列的IsDbGenerated property。唯一的限制是您无法使用Linq更新值。

答案 1 :(得分:5)

从右侧“相关”框的顶部开始:

Sequential GUID in Linq-to-Sql?

如果您真的想要“下一个”值,请使用int64而不是GUID。 COMB guid将确保订购GUID。

答案 2 :(得分:1)

关于你的“如果语句包含没有INTO子句的OUTPUT子句,DML语句的目标表不能有任何启用的触发器”,请查看这篇MS KB文章,它似乎是LINQ中的一个错误:

http://support.microsoft.com/kb/961073

答案 3 :(得分:1)

你真的需要做几件事。

  1. 删除对GUID类型属性的任何分配
  2. 将列更改为自动生成
  3. 在数据库中创建约束以将列默认为NEWSEQUENTIALID()
  4. 像以前一样插入提交。
  5. 在插入到表中的ID将被创建并将是顺序的。 Performance comparison of NEWSEQUENTIALID() vs. other methods

答案 4 :(得分:0)

当使用自动生成的(guid / sequential guid)主键并在表上触发时,Linq2Sql中存在一个错误..这就是导致错误的原因。这个问题有一个修补程序:

http://support.microsoft.com/default.aspx?scid=kb;en-us;961073&sd=rss&spid=2855

答案 5 :(得分:0)

Masstransit使用combigid:

https://github.com/MassTransit/MassTransit/blob/master/src/MassTransit/NewId/NewId.cs

这就是你要找的东西吗?

来自维基百科的

  

顺序算法

     

GUID通常用作数据库表的主键,和   通过这种方式,表通常在该属性上具有聚簇索引。   这在插入记录时会出现性能问题,因为a   完全随机的GUID意味着可能需要在任何地方插入记录   在表格内,而不是仅仅附加在它的末尾。作为一个   在提供足够的随机性的同时缓解这个问题的方法   有效防止重复数量冲突,几种算法   已被用于生成顺序GUID。第一种技术,   Jimmy Nilsson在2002年8月描述[7]并称之为   “COMB”(“组合guid / timestamp”)替换Data4的最后6个字节   具有当前系统日期/时间的最不重要的6个字节。   虽然这可能导致在内部无序生成的GUID   相同的一秒钟,他的测试显示这一点很少   现实世界对插入的影响。这种方法的一个副作用是   插入的日期和时间可以很容易地从中提取出来   价值以后,如果需要的话。从Microsoft SQL Server版本开始   2005年,微软在Transact-SQL语言中添加了一个函数   NEWSEQUENTIALID(),[8]生成保证的GUID   价值增加,但可能从较低的数字开始(仍然保证   当服务器重新启动时。这减少了数据库的数量   可以发生插入的表页,但不保证   价值总是会增加。这个值返回的值   函数可以很容易预测,所以这个算法不太适合   用于为安全或散列目的生成模糊数字。在   2006年,程序员发现Oracle提供的SYS_GUID函数   在一些平台上返回顺序GUID,但这似乎是   是一个错误而不是一个功能。[9]

答案 6 :(得分:0)

您必须处理OnCreated()方法

Partial Class CaseNote
    Sub OnCreated()
        id = Guid.NewGuid()
    End Sub
End Class