2015-08-09 105 views
0

我有一個空表,它有兩列:Id和Title。添加guid默認值約束到sql主鍵不起作用

該Id是​​類型,Primary key,所以Not Nullable

我嘗試添加constraint爲標識的默認值,約束是這樣的:

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

在實體框架,因爲ID不是空的,它填補了標識與'00000000-0000-0000-000000000000'值。

因此,我在sql中的約束不能用於創建新的sequentialId()屬性,我在表中的第一條記錄得到'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;} 
} 
+1

[如何爲實體框架中的GUID設置NewId()](http:// stackoverflow。 com/questions/18200817/how-to-set-newid-for-guid-in-entity-framework) –

回答

0

地圖你的財產ID作爲計算是這樣的:

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

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

,或者,如果你已經EDMX必須在設計師編輯屬性: property mapping

+0

感謝您的意見,但我試了一下,並沒有工作,仍然是同樣的錯誤 – Mostafa

+0

@Mostafa顯示您的映射代碼 – Backs

+0

我更新代碼,因爲我使用數據庫優先方法我沒有映射代碼,只需將屬性放在我的模型上即可。 – Mostafa

0

除非你有一定的要求,這個做硬盤的方式:

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

NEWID()TSQL相當於GUID.NewGuid()