Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何自动填充顺序Guid默认值_C#_Sql_Sql Server_Asp.net Mvc - Fatal编程技术网

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的好处。现在预测价值毫无痛苦。您还可以使用标识。它占用更少的存储空间、更少的索引空间,并且更易于使用。