2009-04-15 53 views
7

我有一个数据库是合并复制方案的一部分,它具有一个GUID,因为它是PK。具体而言,数据类型是uniqueidentifier,默认值(newsequentialid()),RowGUID设置为。当我做一个InsertOnSubmit(CaseNote)时,我想我可以单独离开CaseNoteID,并且数据库会像MSSMS中手动输入一个新行一样输入下一个Sequential GUID。相反,它会发送00000000-0000-0000-0000-000000000000。如果我添加CaseNoteID = Guid.NewGuid(),我得到一个GUID,但不是一个顺序的(我很确定)。LINQ to SQL插入顺序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该列,现在我碰到下面的错误 - >DML语句的目标表不能有任何启用的触发器如果该语句包含一个不带INTO子句的OUTPUT子句。 想法?

回答

5

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

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

+0

我尝试这样做,我现在碰到下面的错误 - > DML语句不能有任何启用的触发器的目标表,如果语句包含一个OUTPUT子句没有INTO子句。 – 2009-04-15 18:37:13

+0

如果它不工作,你为什么接受答案? – guiomie 2013-06-19 18:16:21

+0

对我来说这已经设置好了,但数据库仍然试图分配默认的0的guid而不是生成一个。 – DCShannon 2015-05-14 19:01:33

5

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

Sequential GUID in Linq-to-Sql?

如果你真的想“下一个”值,可以使用64位整数,而不是GUID。 COMB guid将确保GUID是有序的。

1

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

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

1

你真的需要做两件事情。

  1. 删除任何分配给GUID type属性
  2. 更改列自动生成
  3. 在数据库中创建一个约束默认列NEWSEQUENTIALID()
  4. 不要插上提交就像你之前。

在插入到表中时,ID将被创建并且将是顺序的。 Performance comparison of NEWSEQUENTIALID() vs. other methods

0

Masstransit使用combguid:

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

这是你在找什么?

从维基百科:

序贯算法

的GUID通常用作数据库表的主键, 与,常常表具有该属性聚簇索引。 插入记录时会出现性能问题,因为 完全随机的GUID意味着记录可能需要插入表格中的任何位置 而不是仅附加在表尾附近。作为缓解这个问题的方式,同时仍然提供足够的随机性以有效地防止重复的号码冲突,已经使用几种算法 来产生顺序的GUID。 Jimmy Nilsson于2002年8月描述的第一种技术 [7]并且被称为 “COMB”(“组合guid /时间戳”),用数据的最低有效6字节替换Data4的最后6个字节当前系统日期/时间。 虽然这可能会导致在 的同一小数秒内不按顺序生成的GUID,但他的测试表明,这对插入的实际影响不大。如果需要,此方法的一个副作用是 ,插入的日期和时间可以稍后从 值轻松提取。从Microsoft SQL Server版本 2005开始,Microsoft向Transact-SQL语言添加了一项名为 NEWSEQUENTIALID(),[8]的函数,该函数生成的GUID保证为 增加值,但可能以较低数字开头 唯一)服务器重新启动时。这减少了可能发生插入的数据库页面的数量,但不能保证这些值始终会增加值。这个 函数返回的值可以很容易地预测,所以这个算法不适合用于生成安全或散列目的的模糊数字。在2006年,一位程序员发现Oracle 提供的SYS_GUID函数在某些平台上返回了顺序的GUID,但这似乎是 是一个bug而不是一个特性。

0

你必须处理OnCreated()方法

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