7

我有一个数据库,它是合并复制方案的一部分,它有一个 GUID,因为它是 PK。具体来说,数据类型是uniqueidentifier,默认值(newsequentialid()),RowGUID 设置为Yes。当我执行 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 语句的目标表不能有任何启用的触发器。 想法?

4

7 回答 7

5

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

这等效于列的IsDbGenerated 属性。唯一的限制是您不能使用 Linq 更新值。

于 2009-04-15T18:17:44.100 回答
5

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

Linq-to-Sql 中的顺序 GUID?

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

于 2009-04-15T18:17:48.220 回答
1

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

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

于 2009-07-31T20:46:41.223 回答
1

你真的需要做几件事。

  1. 删除对 GUID 类型属性的任何分配
  2. 将列更改为自动生成
  3. 在数据库中创建一个约束,将列默认为 NEWSEQUENTIALID()
  4. 像以前一样在提交时插入。

在插入到表中时,ID 将被创建并且是连续的。 NEWSEQUENTIALID() 与其他方法的性能比较

于 2010-07-15T12:47:33.143 回答
0

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

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

于 2010-02-05T19:52:41.630 回答
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/时间戳”),将 Data4 的最后 6 个字节替换为当前系统日期的最不重要的 6 个字节/时间。虽然这可能会导致 GUID 在相同的几分之一秒内乱序生成,但他的测试表明这对插入几乎没有实际影响。这种方法的一个副作用是,如果需要,可以在以后轻松地从值中提取插入的日期和时间。从 Microsoft SQL Server 版本 2005 开始,Microsoft 在 Transact-SQL 语言中添加了一个名为 NEWSEQUENTIALID(),[8] 的函数,该函数生成的 GUID 值保证会增加,但在以下情况下可能以较小的数字开始(仍保证唯一)服务器重新启动。这减少了可能发生插入的数据库表页的数量,但不能保证值总是增加值。这个函数的返回值很容易预测,所以这个算法不适合为安全或散列目的生成晦涩的数字。2006 年,一位程序员发现 Oracle 提供的 SYS_GUID 函数在某些平台上会返回顺序 GUID,但这似乎是一个错误而不是一个特性。 [9]

于 2012-05-25T09:38:16.667 回答
0

您必须处理 OnCreated() 方法

Partial Class CaseNote
    Sub OnCreated()
        id = Guid.NewGuid()
    End Sub
End Class
于 2016-04-13T20:48:32.867 回答