簡體   English   中英

“當IDENTITY_INSERT設置為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的主鍵字段
  • 在第一個訂單上取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM