たとえば、次の表があります。
CREATE TABLE Person (
id int IDENTITY(1,1) NOT NULL PK,
firstName nvarchar(20) NOT NULL,
lastName nvarchar(30) NOT NULL,
birtdate datetimeoffset(7) NOT NULL,
age int,
height int,
)
エンティティマッピングの一部があります:
public void Configure(EntityTypeBuilder<Person> builder)
{
...
builder.HasKey(k => k.Id);
builder.Property(k => k.Id)
.ValueGeneratedOnAdd()
.IsRequired();
...
}
クライアント側にそのテーブルがあり、サーバー側に同じテーブルがあるMSSQLサーバーがあります。私のプログラムは、クライアントのテーブルからデータを取得してサーバーに送信し、そこでデータがデータベースに追加されます。データの取得中に問題はありませんが、データを挿入しようとするとエラーが発生します。
SqlException: Cannot insert explicit value for identity column in table 'Person' when IDENTITY_INSERT is set to OFF.
にも関わらず .ValueGeneratedOnAdd()
データを取得すると、IDプロパティ(1、2、3など)が入力されたエンティティが取得されますが、それは問題ではないと思います。
データを取得すると、IDプロパティ(1、2、3など)が入力されたエンティティが取得されますが、それは問題ではないと思います。
実際にはそれは重要であり、問題の原因です。ValueGenerated
型のデフォルト以外の値に値を設定したプロパティ(null
null許容型、0
数値型など)には影響しません。
この動作は、EFCoreドキュメントの「生成された値」セクションで説明されています。
プロパティに値が割り当てられているコンテキストにエンティティを追加すると、EFは新しい値を生成するのではなく、その値を挿入しようとします。プロパティにCLRのデフォルト値(
null
forstring
、0
forint
、Guid.Empty
forGuid
など)が割り当てられていない場合、プロパティには値が割り当てられていると見なされます。詳細については、生成されたプロパティの明示的な値を参照してください。
これは基本的に、データをアップロードするときにいわゆる「ID挿入」シナリオを許可するためです。詳細については、「SQL ServerIDENTITY列への明示的な値」を参照してください。
そうは言っても、その動作を望まない場合は、エンティティをdbコンテキスト/セットに追加Id
する0
前に、すべてのエンティティ(PK)プロパティがに設定されていることを確認してください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加