我有一个数据库是合并复制方案的一部分,它具有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语句的目标表不能具有任何已启用的触发器。 想法?
答案 0 :(得分:5)
在Linq to Sql设计器中,为该列设置Auto Generated Value属性为true。
这相当于列的IsDbGenerated property。唯一的限制是您无法使用Linq更新值。
答案 1 :(得分:5)
答案 2 :(得分:1)
关于你的“如果语句包含没有INTO子句的OUTPUT子句,DML语句的目标表不能有任何启用的触发器”,请查看这篇MS KB文章,它似乎是LINQ中的一个错误:
答案 3 :(得分:1)
你真的需要做几件事。
在插入到表中的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