最近、データベースに新しい「レベル」を追加しました。データベース全体のテーブルの既存の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フィールドによるものですか?この問題を修正する方法を知っていますか?
スリープした後、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およびその他の貢献者に感謝します。
問題は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
私のために働いたのはsimple EDMX update
。以前にIdentity Offを設定してから、autoに変更したので。しかし、Edmxは更新しませんでした。更新後、正常に機能しました。
このインスタンスで私にとってうまくいったのは、クラスの主キープロパティに属性を設定することです。
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }
IDENTITY_INSERTはすでに私のデータベースで有効になっています。
IDは一意でなければなりません。そのためにハッシュを使用します。 (たとえばGUID)
[Key]
public string Id { get; set; }
public your_constructor()
{
Id = Guid.NewGuid().ToString();
}
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)"
OK、あなたはすでに解決策を持っています...
IDからIDを削除するか、追加します
SET IDENTITY_INSERT [dbo].[Project] ON
通常、IDはユーザーの干渉なしに挿入されるため、データを入力しようとしているためエラーが発生します。オンに設定すると、必要なデータを入力できるようになります。または、必要な場合を除き、IDにデータを入力するコードを単純に順番に削除します。
2つのことを試して、それぞれを別々に試してみてください。