如何使用Guid / uniqueidentifier的默认NEWID()/ NEWSEQUENTIALID()?

时间:2017-10-17 02:37:04

标签: c# sql-server entity-framework-6 guid

我有这张桌子:

CREATE TABLE [dbo].[SandTable](
    [Id]   [uniqueidentifier]  NOT NULL,
    [Date] [date]              NULL,
    CONSTRAINT [PK_SandTable] PRIMARY KEY)

ALTER TABLE [dbo].[SandTable] ADD  CONSTRAINT [DF_SandTable_Id]  DEFAULT (NEWID()) FOR [Id]

问题与使用NEWID()和NEWSEQUENTIALID()无关。

我使用linqPad来测试表格。

SandTables.InsertOnSubmit(new SandTable
{
    // I don't provide any value for Id
    Date = DateTime.Now
});
SubmitChanges();

我最初的想法是创建一个Id列,当没有提供Id时,它能够将自己初始化为一个值,但会使用提供id时提供的id。

但是因为Guid是一个结构,而不是一个类,Id永远不会为null,所以Id被初始化为他的默认值(00000000-0000-0000-0000-000000000000)。因此,SQL服务器认为Id始终是一个值,然后永远不会调用NEWID()默认指令。

是否可以强制调用特定值的NEWID()?我应该使用触发器来评估Id的值以及它的时间(00000000-0000-0000-0000-000000000000)然后调用NEWID()吗?有哪些解决方案或解决方法?

1 个答案:

答案 0 :(得分:1)

您可以使用检查约束来执行此操作:

ALTER TABLE [dbo].[SandTable] 
    ADD CONSTRAINT [DF_SandTable_Id] DEFAULT (NEWID()) FOR [Id]

ALTER TABLE [dbo].[SandTable] 
    WITH CHECK ADD CONSTRAINT [CK_SandTable_Id_Empty] 
    CHECK (
        [Id] <> CAST(0x0 AS UNIQUEIDENTIFIER)
    )