2010-08-17 44 views
0

我正在開發一個小窗口應用程序在C#.net在Visual Studio 2010與框架3.5。我使用LinqToSql進行數據庫操作。違反PRIMARY KEY約束無法在對象中插入重複密鑰。在C#.net .... Visual Studio 2010 ...框架3.5

表名:CPROFILE

表中的字段有:

custid    int (primary key), 
custname    varchar(50), 
address    nvarchar(MAX), 
mobileno    nchar(10) 

所以我有'cust id''Is identity'屬性改爲'yes'。它會自動更改其他2個子屬性。

Identity Increment = 1 
Identity Seed =  1, 

後,這些變化在表後,纔有當我嘗試保存一個新的記錄拋出錯誤。

「當IDENTITY_INSERT設置爲OFF時,無法在表'cprofile' 中插入標識列的顯式值。」

+0

您可能只需要從數據庫更新您的實體模型,以便框架知道'custid'是自動生成的,不應該是插入/更新的一部分 – 2010-08-17 17:57:42

回答

1

不太熟悉L2S,但我會說丹尼爾是正確的:從數據庫更新您的模型(通常在某個上下文菜單上)。這應該防止它嘗試將值插入到自動遞增ID列中。

我相信可能有辦法讓它設置IDENTIY_INSERT ON,但我強烈建議不要這樣做。

如果您的表不應該負責設置CustomerId(例如,業務有一些確定方法(特別是以非線性方式),請將您的Customer Id列保留爲PK,但刪除來自列的身份驗證

+0

如果從列中刪除Identity特定,它會拋出「違反PRIMARY KEY約束'PK_cprofile'。無法在對象'dbo.cprofile'中插入重複鍵「。 – Anand 2010-08-17 18:14:45

+0

然後你試圖插入相同的PK值,當它已經存在於你的表中時。如果您知道您將擁有由某些業務規則派生出來的真正獨特的身份作爲您的PK,那麼您只應該_沒有自動遞增的身份密鑰。即使那時我推薦一個標識列,但那只是我。你最好的選擇是,實際上,可能是丹尼爾普拉特的建議(正如我的帖子頂部所指出的......) – AllenG 2010-08-17 18:18:58

-1

如果您嘗試使用之前使用的相同插入語句,則無法再執行此操作。我不確定它是如何在C#端完成的,但是在SQL中,您必須運行語句才能打開identity_insert,然後運行語句。因爲您將列更改爲標識,所以表確保下一個條目始終比前一個條目高1個數字。正因爲如此,你不能簡單地插入值。如果您希望表格爲您創建標識值,只需將其刪除即可。如果我的解釋沒有幫助,希望這會。

表定義(表1) Col1中身份 col2的VARCHAR(50) COL3布爾

插入之前的身份 INSERT INTO表1 VALUES語句(1, '測試',TRUE)

Insert語句後 身份 INSERT INTO TABLE1 VALUES('Test',TRUE)

當身份開啓時,您無法在不啓用identity_edit的情況下指定值。我會看看我是否可以在Linq中找到如何做到這一點。

編輯:我也喜歡丹尼爾說的。沒有想到這一點。

+1

或者更好,請更改您的代碼,使其不會插入標識列。使Id自動遞增的一個要點是您不必在該列中插入值... – AllenG 2010-08-17 18:02:34

+0

DataClasses1DataContext db = new DataClasses1DataContext(); cprofile cs = new cprofile(); cs.custname = textBox1.Text; cs.address = textBox3.Text; cs.mobileno = textBox4.Text; db.cprofiles.InsertOnSubmit(cs); db.SubmitChanges(); 這是我用來插入新記錄的代碼.... – Anand 2010-08-17 18:10:11

相關問題