web-dev-qa-db-ja.com

EF Code Firstでエラーが表示されるIDENTITY_INSERTがOFFに設定されている場合、テーブル 'People'のID列に明示的な値を挿入できません。

Entity Framework 4のコードファースト(EF CodeFirst 0.8)を試していますが、PersonProfile。定義方法は次のとおりです。

_public class Person
{
    public int PersonId { get; set; }

    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? DOB { get; set; }

    public virtual Profile Profile { get; set; }
}

public class Profile
{
    public int ProfileId { get; set; }
    public int PersonId { get; set; }
    public string DisplayName { get; set; }

    public virtual Person Person { get; set; }
}
_

DBコンテキストは次のようになります。

_public class BodyDB : DbContext
{
    public DbSet<Person> People { get; set; }   
}
_

DbSetをその集約ルートと見なすため、ProfilePeopleを定義しませんでした。新しいPersonを追加しようとすると、このコードでProfileのないものでも:

_public Person Add(Person newPerson)
{
    Person person = _bodyBookEntities.People.Add(newPerson);
    _bodyBookEntities.SaveChanges();
    return person;
}
_

次のエラーが表示されます。

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

newPersonオブジェクトには、People.Add()を呼び出すときにPersonIdプロパティの_0_があります。データベーステーブルはPeopleおよびProfilesです。 PersonIdPeopleのPKであり、自動インクリメントIDです。 ProfileIdProfilesのPKであり、自動インクリメントIDです。 PersonIdは、Profilesのnull以外のint列です。

私は何を間違えていますか?私は、EF Code Firstの構成規則に関するすべての規則を遵守していると思います。

42
Howard Pinsley

次のエラーが表示されます。IDENTITY_INSERTがOFFに設定されている場合、テーブル 'People'のID列に明示的な値を挿入できません。

IDENTITY_INSERTはオフになっている自動インクリメント機能だと思います。そのため、データベースのPersonIdフィールドを確認して、それがIDかどうかを確認します。

それに、多分これはあなたの問題も解決するでしょう。

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int PersonId { get; set; }
48
Samidjo

これは、次の手順を実行した場合に発生します。

  1. テーブルに非アイデンティティPKフィールドを作成します。
  2. そのテーブルからエンティティモデルを推測します。
  3. 戻って、PK IDをtrueに設定します。

エンティティモデルとデータベースは同期していません。モデルを更新すると修正されます。昨日これをしなければなりませんでした。

35

EF Code Firstを使用している場合は、[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]注釈属性を他の人がここで提案しているようにmodel.csファイルに追加することに加えて、alsoを作成する必要がありますmodelMap.csファイルに対する同じ効果的な変更(流fluentなマッピング手順):

から変更する:

this.Property(t => t.id)
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

に:

this.Property(t => t.id)
   .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

(私はEF Power Toolsを使用してエンティティモデルとデフォルトマッピングファイルを生成し、その後、1つのId列をprmaryキー列に変換し、Sql ServerでIDENTITYに設定したため、属性とデフォルトのマッピングを更新する必要がありましたファイル。)

両方の場所で変更しない場合でも、同じエラーが表示されます。

11
MattSlay

この問題はありませんでした複合キーを追加するまででしたので、2つのプライマリキーを取得するとEF 6.x.xで発生しました

Identity Specificationをtrueに設定が必要なキー「Id」で、addが必要でした

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]

モデルプロパティ:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Key, Column("Id", Order = 1)]
public int Id { get; set; }

[Key, Column("RanGuid", Order = 2)]
public string RanGuid { get; set; }
4
Tom Stickel

あなたの状況は、PrimaryKeyとForeignKeyが同じ列であるときにEF Code Firstで経験する状況を思い出させます。

モデルを直接更新する方法はありませんが、2つのステップで同じ効果を達成できます。

  1. ProfileクラスのProfileIdをコメント化します。データベースを再コンパイルおよび更新します。
  2. プロファイルIDのコメントを解除し、DatabaseGeneratedAttributeを追加して、データベースを再度更新します。
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key]

これにより、生成されたProfileId列はIDなしのキーになります。

3

検索者のために:このエラーが発生しましたが、上記の修正は機能しませんでした。それは私の側のエラーが原因でした。

テーブルには、Guid主キー(非クラスター化)とintインデックスがあります。

ナビゲーションプロパティとして「ブログ」情報を使用して「投稿」を更新しようとすると、エラーが発生していました。以下のクラスを参照してください。

_public class Blog
{
    public Guid BlogId { get; set; }

    public int BlogIndex { get; set; }

    // other stuff
}

public class Post
{
    public Guid PostId { get; set; }

    public int PostIndex { get; set; }

    // other stuff

    public Blog Blog { get; set; }
}
_

問題は、DTOをモデルに変換しているときに、BlogIdがnew Guid()に変更されていたことです(マッピングでエラーが発生しました)。結果のエラーは、この質問で詳述したものと同じでした。

それを修正するには、データが挿入されたときに正しいことを確認し(正しくない)、データの誤った変更を修正する必要がありました(私の場合、壊れたマッピング)。

2
HockeyJ

これが解決策です。詳細については、添付ファイルもご覧ください。

EFモデルの「.edmx」ファイルに移動します>>開く>>図を右クリックして、「データベースからモデルを更新」を選択します。

EFモデルを作成した後にPKをDBのIDにしたため、これで修正されます。

上記の手順を再作成するのに役立ちます

1
Taha Ali

EF6でこのエラーが発生し、データベースを見て、すべてがIdentity SpecificationYesに設定されます。その後、さまざまな移行を削除し、現在のモデルから1つの新しい移行を行い、すべてが機能し始めました。アプリケーションがまだ稼働しておらず、まだ開発中であるため、最速のソリューション。

enter image description here

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

1
Ogglas

EFコアと私のような流れるようなインターフェースを使用している場合、既存のデータベースからモデルを作成するために使用したScaffold-DbContextユーティリティが、そのような私の列の行を生成することがわかりました。

_entity.Property(e => e.id).ValueGeneratedNever();
_

IDにIDENTITY属性を追加してDBを変更した後、次の行を変更する必要がありました。

_entity.Property(e => e.id).ValueGeneratedOnAdd();
_

モデルクラスのidフィールドに[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key]デコレータを追加する以外。

後者が必要かどうかもわかりません。前の修正プログラムで解決した後、削除しようとしませんでした。

1

私の場合、EFはINT IDフィールド以外の型を好まないようです-私のものはBYTE(SQL側のTINYINT)でした。

Tinyint型のPKを使用してもこのエラーが発生しました。 EFが気に入らないというわけではありません。他の場合とは異なり、次のように設定で指定する必要があるようです。

this.Property(t => t.TableID).HasColumnName("TableID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
0
Pablo Pagues

私の場合、EFは[〜#〜] int [〜#〜] identity field(〜#〜] byte [〜 #〜](SQL側のTINYINT)。

プロジェクトを更新して、SQLで[〜#〜] int [〜#〜]に変更できたため、VisualStudioでリバースエンジニアリングコードを最初に再実行した後、エラーがすぐに発生しました。発生しなくなった。

0
Tuco