Entity Framework 4のコードファースト(EF CodeFirst 0.8)を試していますが、Person
とProfile
。定義方法は次のとおりです。
_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
をその集約ルートと見なすため、Profile
にPeople
を定義しませんでした。新しい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
です。 PersonId
はPeople
のPKであり、自動インクリメントIDです。 ProfileId
はProfiles
のPKであり、自動インクリメントIDです。 PersonId
は、Profiles
のnull以外のint列です。
私は何を間違えていますか?私は、EF Code Firstの構成規則に関するすべての規則を遵守していると思います。
次のエラーが表示されます。IDENTITY_INSERTがOFFに設定されている場合、テーブル 'People'のID列に明示的な値を挿入できません。
IDENTITY_INSERTはオフになっている自動インクリメント機能だと思います。そのため、データベースのPersonIdフィールドを確認して、それがIDかどうかを確認します。
それに、多分これはあなたの問題も解決するでしょう。
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int PersonId { get; set; }
これは、次の手順を実行した場合に発生します。
エンティティモデルとデータベースは同期していません。モデルを更新すると修正されます。昨日これをしなければなりませんでした。
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に設定したため、属性とデフォルトのマッピングを更新する必要がありましたファイル。)
両方の場所で変更しない場合でも、同じエラーが表示されます。
この問題はありませんでした複合キーを追加するまででしたので、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; }
あなたの状況は、PrimaryKeyとForeignKeyが同じ列であるときにEF Code Firstで経験する状況を思い出させます。
モデルを直接更新する方法はありませんが、2つのステップで同じ効果を達成できます。
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key]
これにより、生成されたProfileId列はIDなしのキーになります。
検索者のために:このエラーが発生しましたが、上記の修正は機能しませんでした。それは私の側のエラーが原因でした。
テーブルには、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()
に変更されていたことです(マッピングでエラーが発生しました)。結果のエラーは、この質問で詳述したものと同じでした。
それを修正するには、データが挿入されたときに正しいことを確認し(正しくない)、データの誤った変更を修正する必要がありました(私の場合、壊れたマッピング)。
これが解決策です。詳細については、添付ファイルもご覧ください。
EFモデルの「.edmx」ファイルに移動します>>開く>>図を右クリックして、「データベースからモデルを更新」を選択します。
EFモデルを作成した後にPKをDBのIDにしたため、これで修正されます。
EFコアと私のような流れるようなインターフェースを使用している場合、既存のデータベースからモデルを作成するために使用したScaffold-DbContextユーティリティが、そのような私の列の行を生成することがわかりました。
_entity.Property(e => e.id).ValueGeneratedNever();
_
IDにIDENTITY属性を追加してDBを変更した後、次の行を変更する必要がありました。
_entity.Property(e => e.id).ValueGeneratedOnAdd();
_
モデルクラスのidフィールドに[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key]
デコレータを追加する以外。
後者が必要かどうかもわかりません。前の修正プログラムで解決した後、削除しようとしませんでした。
私の場合、EFはINT IDフィールド以外の型を好まないようです-私のものはBYTE(SQL側のTINYINT)でした。
Tinyint型のPKを使用してもこのエラーが発生しました。 EFが気に入らないというわけではありません。他の場合とは異なり、次のように設定で指定する必要があるようです。
this.Property(t => t.TableID).HasColumnName("TableID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
私の場合、EFは[〜#〜] int [〜#〜] identity field(〜#〜] byte [〜 #〜](SQL側のTINYINT)。
プロジェクトを更新して、SQLで[〜#〜] int [〜#〜]に変更できたため、VisualStudioでリバースエンジニアリングコードを最初に再実行した後、エラーがすぐに発生しました。発生しなくなった。