如何自动填充Sequential Guid默认值
本文关键字:Guid 默认值 Sequential 填充 何自动 | 更新日期: 2023-09-27 18:03:53
设置
我有一个uniqueidentifier
列,它被设置为primary key
,Default Value or Binding
为(newsequentialid())
。
什么有效
在我的MVC项目中,我可以使用[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
和Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
之类的东西来允许SQL Server接管并使用指定的Default Value or Binding
来自动生成Sequential Guid,这很好。
什么不起作用
但是,如果我在MVC项目之外编写代码,特别是在LINQPad中,则总是插入一个空的Guid,例如00000000-0000-0000-0000-000000000000
:
Resources.InsertOnSubmit(new Resource());
SubmitChanges();
我知道我可以写这样的东西来插入一个随机化的Guid值:new Resource() { Id = Guid.NewGuid() }
,但我需要一个Sequential Guid。
为什么我感到困惑
我的印象是,当一个null或空值被传递到SQL Server列时,如果指定了Default Value or Binding
,就会自动使用。
问题1:
为什么在使用LINQPad时会忽略Default Value or Binding
?
问题2:
当我无法访问上面提到的MVC属性时,如何使SQL Server使用(newsequentialid())
中指定的Default Value or Binding
?
NULL
,SQL Server将忽略列上的默认绑定。类似地,如果您的MVC项目正在生成00000000-0000-0000-0000-000000000000
的默认Guid
,那么SQL Server将简单地将该值插入到您的表中。
一种选择是简单地从MVC项目中生成自己的顺序GUID。C#中有很多顺序GUID生成器的例子。我个人喜欢Alex Siemman的顺序GUID解决方案,您可以在以下位置找到它:http://www.siepman.nl/blog/post/2015/06/20/SequentialGuid-Comb-Sql-Server-With-Creation-Date-Time-.aspx
或者,您可以在目标表上创建INSTEAD OF INSERT
触发器,以便以您想要的方式正确处理插入。在您的情况下,您希望省略传递给表的ID,并让SQL Server为您生成ID。触发器将如下所示:
CREATE TRIGGER AutoGuid_Trigger ON [dbo].[YourTableName]
INSTEAD OF INSERT AS
BEGIN
INSERT INTO [dbo].[YourTableName]
(
-- Exclude ID from column list, SQL Server will generate the ID
[YourCol1]
,[YourCol2]
,[YourCol3]
,...
)
SELECT [YourCol1]
,[YourCol2]
,[YourCol3]
,...
FROM inserted
END