web-dev-qa-db-ja.com

複合キーで「IDENTITY_INSERTがOFFに設定されている場合、テーブルのID列に明示的な値を挿入できません」

最近、データベースに新しい「レベル」を追加しました。データベース全体のテーブルの既存のID IDフィールドの上/前にキー「Company_ID」を追加しました。

たとえば、テーブルにID thenフィールドがあった場合、Company_ID、ID、フィールドの順になります。これにより、機能に提供される異なるCompany_ID値ごとに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がデータベースによって自動入力され、ビューなどを使用してSHOWを実行するために使用されました。

ただし、ここでは、Company_IDを指定された値に設定し、IDをそのままにして、以前のようにフィールドにデータを入力します。

    _db.Project.Add(newProject);
    _db.SaveChanges();

はい、Company_ID値を指定します。以前のように、IDが自動入力されるようにします。エラーメッセージが表示されます。

IDENTITY_INSERTがOFFに設定されている場合、テーブル「Project」のID列に明示的な値を挿入できません

これは、Company_IDの指定によるものですか、IDフィールドによるものですか?この問題を修正する方法を知っていますか?

12
and_E

スリープした後、Visual Studio C#コードの[DatabaseGenerated(DatabaseGeneratedOption.Identity)]でこれを見つけました。これは(私の言葉では)IDフィールドごとに定義され、フィールドがIDであり、データベースに値を送信するときに「そのままにする」ことをVisual Studioに伝えます。 _Company_ID_が最初に発生し、値を持っている場合、Visual Studioに別の場所にIdentityフィールドがあることを伝えると、_db.Project.Add(newProject);が次に必要に応じて_db.SaveChanges();が機能します。答えのこの部分は、Visual Studio側のものです。 _IDENTIY_INSERT_のSQL要件を理解しているので、@ matt-thrower、@ steve-pettiferおよびその他の貢献者に感謝します。

11
and_E

問題はIDにあります。フィールドをIDENTITYとして設定した場合、通常は値を割り当てることができません。IDENTITYプロパティは、データベースが列に増分値を自動的に割り当てることができるようにマークします。

この問題を解決するには、IDから自動IDENTITYプロパティを削除します(自動インクリメントしたい場合は、処理コードでいつでもこれを行うことができます-フィールドで最高値を取得し、それに追加してからその値を割り当てます)またはDBにアクセスして、テーブルにIDENTITY _INSERTを設定します。これにより、一時的にIDENTITYフィールドに値を割り当てることができます。

SET IDENTITY_INSERT [yourTableName] ON

--go back and run your C# code>

SET IDENTITY_INSERT [yourTableName] OFF
14
Matt Thrower

私のために働いたのはsimple EDMX update。以前にIdentity Offを設定してから、autoに変更したので。しかし、Edmxは更新しませんでした。更新後、正常に機能しました。

このインスタンスで私にとってうまくいったのは、クラスの主キープロパティに属性を設定することです。

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }

IDENTITY_INSERTはすでに私のデータベースで有効になっています。

3
steveareeno

IDは一意でなければなりません。そのためにハッシュを使用します。 (たとえばGUID)

[Key]
public string Id { get; set; }

public your_constructor()
{
    Id = Guid.NewGuid().ToString();
}
0
Marci

SQLテーブルの外部キーのインクリメントはSet automatic ...ですので、何かを挿入したいときは、この例のようなコードからこの外部キーを削除する必要があります。

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)"
0
Mensinovish

OK、あなたはすでに解決策を持っています...

0
user2956759

IDからIDを削除するか、追加します

SET IDENTITY_INSERT [dbo].[Project] ON

通常、IDはユーザーの干渉なしに挿入されるため、データを入力しようとしているためエラーが発生します。オンに設定すると、必要なデータを入力できるようになります。または、必要な場合を除き、IDにデータを入力するコードを単純に順番に削除します。

0
Keii

2つのことを試して、それぞれを別々に試してみてください。

  • IDおよびCompany_IDの主キーフィールドを削除します
  • 最初の注文でID列を取る
0
kemals