C# 如何自动填充顺序Guid默认值
设置 我有一个C# 如何自动填充顺序Guid默认值,c#,sql,sql-server,asp.net-mvc,C#,Sql,Sql Server,Asp.net Mvc,设置 我有一个uniqueidentifier列,它被设置为主键,具有(newsequentialid())的默认值或绑定 什么有效 在我的MVC项目中,我可以使用[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]和属性(t=>t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)允许SQL Server接管并使用指定的默认值或绑定自动生成顺序Guid,这
uniqueidentifier
列,它被设置为主键
,具有(newsequentialid())
的默认值或绑定
什么有效
在我的MVC项目中,我可以使用[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
和属性(t=>t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
允许SQL Server接管并使用指定的默认值或绑定
自动生成顺序Guid,这可以正常工作
什么不起作用
但是,如果我在MVC项目之外编写代码,特别是在LINQPad中,则始终会插入一个空Guid,例如00000000-0000-0000-0000-000000000000
:
Resources.InsertOnSubmit(new Resource());
SubmitChanges();
我知道我可以编写类似这样的代码来插入随机Guid值:new Resource(){Id=Guid.NewGuid()}
,但我需要一个顺序Guid
我为什么困惑
我的印象是,当向SQL Server列传递null或空值时,将自动使用默认值或绑定(如果指定)
问题1:
为什么在使用LINQPad时会忽略默认值或绑定
问题2:
当我无法访问上述MVC属性时,如何使SQL Server使用(newsequentialid())
的指定默认值或绑定?关于第二个问题,如果在insert语句中明确指定了NULL
,SQL Server将忽略列上的默认绑定。类似地,如果您的MVC项目正在生成00000000-0000-0000-0000-000000000000
的默认Guid
,那么SQL Server只需将该值插入表中即可
一种选择是从MVC项目生成自己的顺序GUID。在C#中有很多顺序GUID生成器的示例。我个人喜欢Alex Siepman的顺序GUID解决方案,您可以在以下位置找到它:
或者,您可以在目标表上创建而不是INSERT
触发器,以便以所需的方式正确处理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
根据定义,全局唯一标识符是随机的,如果不是,则完全不适合其主要功能,提供来自多个位置的唯一密钥。因此,如果您使用的是顺序ID,那么您没有使用guid,它只是一个十六进制编码的128位整数guid数据类型是一个结构,这意味着它不能包含null,只能包含默认值0,但可以尝试将其更改为guid?作为主键的guidGuids通常是一个非常糟糕的选择。如果它们也是聚集索引(这是默认值),那么碎片率会跳到99.99%,只有几千行。这意味着您必须不断地对索引进行碎片整理。在您的情况下,您使用的是顺序ID,这消除了碎片,但首先也失去了guid的好处。现在预测价值毫无痛苦。您还可以使用标识。它占用更少的存储空间、更少的索引空间,并且更易于使用。