如何自动填充Sequential Guid默认值

时间:2016-08-25 12:57:04

标签: c# sql sql-server asp.net-mvc

设置

我有一个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() },但我需要一个顺序指导。

为什么我感到困惑

我的印象是,当一个null或空值传递给SQL Server列时,Default Value or Binding(如果已指定)将自动使用。

问题#1:

为什么在使用LINQPad时会忽略Default Value or Binding

问题#2:

当我无法访问上述MVC属性时,如何让SQL Server使用指定的Default Value or Binding (newsequentialid())

1 个答案:

答案 0 :(得分:1)

关于第二个问题,如果在insert语句中明确指定NULL,SQL Server将忽略列上的默认绑定。同样,如果您的MVC项目生成Guid的默认00000000-0000-0000-0000-000000000000,那么SQL Server只会将值插入到您的表中。

一种选择是从MVC项目中简单地生成自己的顺序GUID。 C#中有很多顺序GUID生成器的例子。我个人喜欢Alex Siepman顺序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