[英]Entity Framework: Cannot insert explicit value for identity column in table '[table]' when IDENTITY_INSERT is set to OFF
[英]“Cannot insert explicit value for identity column in table when IDENTITY_INSERT is set to OFF” with composite key
我們最近在數據庫中添加了一個新的“級別” - 在整個數據庫的表中的現有ID Identity字段之上/之前添加了一個鍵“Company_ID”。
例如,如果表具有ID然后是字段,則它現在具有Company_ID,然后是ID,然后是字段。 這個想法是,這允許ID為提供給功能的每個不同的Company_ID值自動遞增(Company_ID 1可以具有ID 1,2,3等; Company_ID 2可以具有ID 1,2,3等)。
自動增量字段保留為ID。 示例表是:
[dbo].[Project](
[Company_ID] [int] NOT NULL,
[ID] [int] IDENTITY(1,1) NOT NULL,
[DescShort] [varchar](100) NULL,
[TypeLookUp_ID] [int] NULL,
[StatusLookUp_ID] [int] NULL,
[IsActive] [bit] NOT NULL,
CONSTRAINT [PK_Project] PRIMARY KEY CLUSTERED
(
[Company_ID] ASC,
[ID] ASC
)
在引入Company_ID之前,為了執行CREATE,我們只需填充DescShort,TypeLookUp_ID,StatusLookUp_ID和IsActive字段,並將ID保留為默認值,可能為0。
記錄已成功保存,ID由數據庫自動填充,然后用於通過View執行SHOW,依此類推。
但是,現在我們要將Company_ID設置為指定值,保留ID,並像以前一樣填充字段。
_db.Project.Add(newProject);
_db.SaveChanges();
是的,我們要指定Company_ID值。 我們希望自動填充ID,如前所述。 我們收到錯誤消息:
當IDENTITY_INSERT設置為OFF時,無法在表“Project”中為identity列插入顯式值
這是由指定Company_ID還是ID字段引起的? 你知道我們如何糾正這個問題嗎?
問題在於ID。 如果將字段設置為IDENTITY,則通常無法為其分配值 - IDENTITY屬性將其標記為允許數據庫自動為列指定遞增值。
要解決此問題,請從ID中刪除自動IDENTITY屬性(如果要自動遞增它,您可以在處理代碼中始終執行此操作 - 在字段中獲取最高值,向其中添加一個,然后分配該值)或轉到數據庫並在表上設置IDENTITY _INSERT,這暫時允許您為IDENTITY字段分配值。
SET IDENTITY_INSERT [yourTableName] ON
--go back and run your C# code>
SET IDENTITY_INSERT [yourTableName] OFF
睡覺后,我發現了這個,對於Visual Studio c#代碼: [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
。 這個(在我看來),為我的每個ID
字段定義,告訴Visual Studio該字段是一個標識,並在向數據庫發送值時“不管它”。 當Company_ID
首先出現並且有一個值時,告訴Visual Studio其他地方有一個Identity字段允許_db.Project.Add(newProject);
然后_db.SaveChanges();
按要求運作。 這部分答案是針對Visual Studio方面的。 我理解IDENTIY_INSERT
的SQL要求,所以感謝@ matt-thrower,@ steve-pettifer和其他貢獻者。
對我simple EDMX update
是一個simple EDMX update
。 因為我之前設置了身份關閉,然后將其更改為自動。 但沒有更新Edmx。 更新后,它工作正常。
在這個例子中對我有用的是在類中的主鍵屬性上設置一個屬性:
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }
IDENTITY_INSERT已在我的數據庫中。
從Id中刪除標識或添加
SET IDENTITY_INSERT [dbo].[Project] ON
通常插入ID時不會受到用戶干擾,因此您會收到錯誤,因為您正在嘗試在其中輸入數據。 設置它將允許您輸入您想要的數據OR,簡單地將您輸入數據的代碼刪除到ID中,除非這是您需要的東西
你可以嘗試兩件事並分別嘗試嗎?
好的,您已經有了解決方案......但考慮將ID保留為唯一主鍵,將Company_Id保留為外鍵
SQL表中外鍵的增量是自動設置...所以當你想插入任何東西時,你必須從像這樣的代碼中刪除這個外鍵。
Sql代碼:
CREATE TABLE [dbo].[annexe1](
[cle] [int] IDENTITY(1,1) NOT NULL,
[tarif] [nvarchar](50) NULL,
[libele] [nvarchar](max) NULL)
Asp.Net代碼:
InsertCommand = "INSERT INTO [annexe6] ([cle], [tarif], [libele]) VALUES (@cle, @tarif, @libele)"
更正:
InsertCommand = "INSERT INTO [annexe6] ([tarif], [libele]) VALUES (@tarif, @libele)"
您的ID必須是唯一的。 為此使用一些哈希。 (例如GUID)
[Key]
public string Id { get; set; }
public your_constructor()
{
Id = Guid.NewGuid().ToString();
}
如果您的表中有自動增量字段,請查看。 將自動增量設置為NO,然后執行SQL。 在該字段中重新放入自動增量並再次同步后。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.