C# 如何将默认的NEWID()/NEWSEQUENTIALID()与Guid/uniqueidentifier一起使用?

C# 如何将默认的NEWID()/NEWSEQUENTIALID()与Guid/uniqueidentifier一起使用?,c#,sql-server,entity-framework-6,guid,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 [

我有这张桌子:

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从不为空的类,Id被初始化为其默认值(
00000000-0000-0000-0000-000000000000
)。因此SQLServer认为ID始终是一个值,然后从不调用NeWess()默认指令。
是否可以强制对特定值调用NEWID()?我是否应该使用触发器来计算Id的值,当它为(
00000000-0000-0000-0000-000000000000
)时,调用NEWID()?解决方案或解决方法是什么?

您可以通过检查约束来完成:

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)
    )
ALTER TABLE[dbo].[SandTable]
为[Id]添加约束[DF_SandTable_Id]默认值(NEWID())
ALTER TABLE[dbo].[SandTable]
使用复选框添加约束[CK\u SandTable\u Id\u Empty]
检查(
[Id]强制转换(0x0作为唯一标识符)
)

这里有一个类似的问题,很有趣,但没有回答我的具体问题:可能是一个愚蠢的问题,但如果您知道要插入-为什么不在代码中创建id=GUID.NewGuid()的GUID?因为您想让SQL创建它?是否也在使用存储过程作为插入选项?然后,您可以检查guid是否为空,如果为空,则生成一个新的guid并执行插入。出于兼容性原因,因为我正处于迁移应用程序的情况。旧应用程序从未优化的存储过程中插入新数据。我无法告诉您我们有多少版本的INSERT。新的应用程序使用C代码。因此,新应用程序可以创建Guid,但我不能修改所有旧查询。我在C#代码中使用实体框架。我宁愿避免使用存储过程。出于维护原因,我希望将所有逻辑都保留在C#中。(我也不信任我的DBA团队)我相信,Check约束用于验证传入的输入。请详细说明这一行:
[Id]CAST(0x0作为唯一标识符)
这会阻止插入,我相信他希望它只生成NewID(),如果传入的Id是0x0(我可能是错的)。我误解了这个问题。我将很快更新一个新的答案。我与LinqPad shen确认我插入了第一行,它可以工作。我得到了默认Id,然后在下一次插入时,我得到了经典的“SqlException:违反主键约束'PK_SandTable'。无法在对象'dbo.SandTable'中插入重复的键。该语句已终止。”逻辑。我认为您无法使用约束或默认值来完成此操作。触发器是您在这里的唯一选项。