我有一个空表,有两列: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"
错误。
我知道我可以在.NeT中生成guid,如Guid.NewGuid()
并填充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;}
}
答案 0 :(得分:1)
将您的媒体资源ID映射为这样的计算:
?rel=0
OR
Property(o => o.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
答案 1 :(得分:0)
除非你有一些要求以艰难的方式做到这一点:
ALTER TABLE [dbo].[TestTable] ADD CONSTRAINT [DF_TestTable_Id]
DEFAULT (NEWID()) FOR [Id]
NEWID()
是TSQL
等同于GUID.NewGuid()