2017-07-05 42 views
1

我正在遷移用於Azure的本地SQL Server 2014數據庫。我有一個運行在IIS 8中的Asp.net MVC應用程序,它以通常的方式使用實體框架連接到Azure SQL Server數據庫。實體框架:插入導致使用Azure SQL違反PRIMARY KEY約束,而不是本地

  1. 我有一個dbContext
  2. Using(... dbContext.Database.BeginTransaction())
  3. 其他實體加入SaveChanges()成功
  4. 運行特別是對於一個實體,我做db.entity.add(newEntity),然後SaveChanges()和獲取:

    例外:違反PRIMARY KEY約束'PK_entity'。不能在對象'dbo.entity'中插入重複鍵。重複的鍵值是(2)。

的主鍵是自動增加的編號,我運行此的唯一用戶。該表中已有156條記錄。

奇怪的是,當我在本地機器上使用本地SQL Server實例運行這個工作時,這工作正常,但是當從IIS和Azure數據庫運行時,會發生此異常。

該實體根本沒有其他關係/限制。

我覺得可能有線索,如果我一直試圖保存這個記錄(ISS和Azure),失敗的重複鍵值每次增加1。

+0

'有156條記錄在此表中already' - SELECT * FROM thistable好嗎? –

+1

如果您可以從該表中刪除所有記錄,然後嘗試「添加()」。這將證明如果錯誤不是由於現有數據造成的。 – MKR

+1

最小程度地共享表格DDL和EF模型的相關部分,以及導致錯誤的數據庫通信的EF日誌(db.Database.Log = m => MyLogger(m))。最好把問題歸結爲一個完整的,獨立的repro。當你這樣做時,你可能會發現問題的根源。 –

回答

3

That's很奇怪,也許是身份科爾在Azure中屋宇署索引設置爲1 你可以強迫你的身份科爾比你的最後一個ID大的索引表:

在SQL Server你可以查看下一張ID:

SELECT IDENT_CURRENT ('tablename') AS Current_Identity; 

你可以把它強制到其他號碼:

DBCC CHECKIDENT ('tablename', RESEED, 157); 
+2

在我的Azure SQL數據庫上測試了DBCC命令後,我發現我需要刪除Identitycoll才能使命令正常工作。 DBCC CHECKIDENT('tablename',RESEED,157); – Amor

+0

謝謝瑞。對於156的表格,'IDENT_CURRENT'返回6! – Ian

+0

這就是問題所在,你必須修復索引,因爲Amor-MSFT評論正確的命令是DBCC CHECKIDENT('tablename',RESEED,157); –

相關問題