如何自动填充Sequential Guid默认值

本文关键字:Guid 默认值 Sequential 填充 何自动 | 更新日期: 2023-09-27 18:03:53

设置

我有一个uniqueidentifier列,它被设置为primary keyDefault 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

如何自动填充Sequential Guid默认值

关于第二个问题,如果在insert语句中显式指定了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