将 guid 默认值约束添加到 sql 主键不起作用
Adding guid default value constraint to sql primary key not working
我有一个空的 table,它有两列:Id 和 Title。
Id 是 guid
类型 , Primary key
, 所以 Not Nullable
.
我尝试为 Id 的默认值添加一个 constraint
,约束是这样的:
ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Id] DEFAULT (newsequentialid()) FOR [Id]
GO
在Entity Framework中,由于Id不可为空,所以用'00000000-0000-0000-000000000000'
值填充Id。
因此,我在 sql 中的约束无法 属性 用于创建新的 sequentialId()
并且我在 table 中的第一条记录获得 '00000000-0000-0000-000000000000'
值。
第二行非常明显:
"Vaiolation of PRIMARY KEY Constraint "PK_TestTable". Cannot insert Duplicate Key"
错误。
我知道我可以像 Guid.NewGuid()
一样在 .Net 中生成 guid 并用值填充 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 数据库第一种方法映射是:
public partial class TestTable
{
[DatabaseGenerated(DatabaseGenereatedOption.Computed)]
public System.Guid Id {get ;set;}
public string Title {get; set;}
}
将您的 属性 ID 映射为这样计算的:
Property(o => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
或
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
或者,如果您有 edmx,则必须在设计器中编辑 属性:
除非你有一些要求以困难的方式做到这一点:
ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Id]
DEFAULT (NEWID()) FOR [Id]
NEWID()
是 TSQL
等同于 GUID.NewGuid()
我有一个空的 table,它有两列:Id 和 Title。
Id 是 guid
类型 , Primary key
, 所以 Not Nullable
.
我尝试为 Id 的默认值添加一个 constraint
,约束是这样的:
ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Id] DEFAULT (newsequentialid()) FOR [Id]
GO
在Entity Framework中,由于Id不可为空,所以用'00000000-0000-0000-000000000000'
值填充Id。
因此,我在 sql 中的约束无法 属性 用于创建新的 sequentialId()
并且我在 table 中的第一条记录获得 '00000000-0000-0000-000000000000'
值。
第二行非常明显:
"Vaiolation of PRIMARY KEY Constraint "PK_TestTable". Cannot insert Duplicate Key"
错误。
我知道我可以像 Guid.NewGuid()
一样在 .Net 中生成 guid 并用值填充 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 数据库第一种方法映射是:
public partial class TestTable
{
[DatabaseGenerated(DatabaseGenereatedOption.Computed)]
public System.Guid Id {get ;set;}
public string Title {get; set;}
}
将您的 属性 ID 映射为这样计算的:
Property(o => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
或
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
或者,如果您有 edmx,则必须在设计器中编辑 属性:
除非你有一些要求以困难的方式做到这一点:
ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Id]
DEFAULT (NEWID()) FOR [Id]
NEWID()
是 TSQL
等同于 GUID.NewGuid()