【问题标题】:Adding guid default value constraint to sql primary key not working将guid默认值约束添加到sql主键不起作用
【发布时间】:2015-08-09 11:22:17
【问题描述】:

我有一个空表,有两列:Id 和 Title。

ID 是 guid 类型,Primary key,所以是 Not Nullable

我尝试为 Id 的默认值添加一个constraint,约束是这样的:

ALTER TABLE [dbo].[TestTable] ADD  CONSTRAINT [DF_TestTable_Id]  DEFAULT (newsequentialid()) FOR [Id]
GO

在实体框架中,由于Id不可为空,所以用'00000000-0000-0000-000000000000'值填充Id。

因此,我在 sql 中的约束不适用于创建新的 sequentialId() 属性,并且我在表中的第一条记录获得 '00000000-0000-0000-000000000000' 值。 第二行很明显,它得到了:

"Vaiolation of PRIMARY KEY Constraint "PK_TestTable". Cannot insert Duplicate Key" 错误。

我知道我可以像 Guid.NewGuid() 这样在 .NeT 中生成 guid 并用 value 填充 Id,但我正试图将此责任委托给 sql 和 newsequentialId() 默认值。

我想知道我该怎么做?

有关完整信息,我将整个脚本放在这里:

CREATE TABLE [dbo].[TestTable](
    [Id] [uniqueidentifier] NOT NULL,
    [Title] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[TestTable] ADD  CONSTRAINT [DF_TestTable_Id]  DEFAULT (newsequentialid()) FOR [Id]
GO

更新:我的 EF 数据库第一个方法 Mapping 是:

public partial class TestTable 
{
    [DatabaseGenerated(DatabaseGenereatedOption.Computed)]
    public System.Guid Id {get ;set;}
    public string Title {get; set;}
}

【问题讨论】:

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


【解决方案1】:

将您的属性 ID 映射为这样计算:

Property(o => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

或者,如果您有 edmx,则必须在设计器中编辑属性:

【讨论】:

  • 谢谢你的想法,但我试了一下,还是不行,还是一样的错误
  • 我更新代码,因为我使用数据库优先方法我没有映射代码,只是将属性放在我的模型上。
  • @Mostafa 你有 edmx,你应该更新设计器中的 Id 属性,我编辑了我的答案
  • 感谢您的想法,我将 StoreGeneratedPattern 更改为 Identity(默认情况下不是)并且可以正常工作(我不知道为什么),请更正您的答案,以便我接受您的答案。
  • @Mostafa 当然是主键。我编辑了答案
【解决方案2】:

除非你有一些要求以艰难的方式做到这一点:

ALTER TABLE [dbo].[TestTable] ADD  CONSTRAINT [DF_TestTable_Id] 
    DEFAULT (NEWID()) FOR [Id]

NEWID()TSQL 等价于 GUID.NewGuid()

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多