1

新しいエンティティをデータベースに保存するときに問題があります。新しいエンティティを保存するたびにDbEntityValidationException発生します。しかし、変数の値とエンティティのデータ注釈を注意深く見ると、それらすべてに一致します。

データベースを調べたところ、追加しているエンティティではなく、データベースに保存された以前のエンティティに問題があるようです。何らかの理由で、エンティティを追加する前に値を持っていた外部キー フィールドの一部が NULL になりました。

デバッグ中に、これらのエンティティをすべてスキャンしSaveChanges()ました。メソッドを呼び出す前に、これらのフィールドはそこにあり、null ではありません。次に、を呼び出した後、他のレコードを台無しにする何かを行った可能性SaveChanges()があるため、検証エラーが発生します。SaveChanges()

これが関係しているかどうかはわかりませんが、新しいエンティティを作成するときに、その新しいインスタンスを作成し、そのプロパティを個別に割り当てます。そのプロパティの一部は、エンティティ フレームワークから取得され、添付されています。そのため、添付プロパティを切り離された新しいオブジェクトに割り当てています。これが奇妙な動作を引き起こしたかどうかはわかりません。抜粋例を次に示します。

Book book = new Book();
book.Title = "The FooBar";
book.Publisher = publisherRepository.Get(1); // will retrieve a Publisher object from EF

bookRepository.Add(book);

....

// under BookRepository class
public void Add(Book book)
{
   dbContext.Books.Add(book);
   // just to check if the other records are not messed up, I did this and
   // check the values in VS Debugger
   // At this point, the other records are not yet affected.
   var books = dbContext.Books.Include("Publisher").ToArray();

   dbContext.SaveChanges(); // error thrown here, 
   // checking at the validation error, other book 
   //instances have their Publisher property set to NULL!
}

この問題に対する他の解決策が見つからないので、助けてください。私はEntity Frameworkの初心者です。

4

2 に答える 2

1

この行var books = dbContext.Books.Include("Publisher")では、データベースに対してクエリを実行し、エンティティ フレームワークに、すべての本にリンクされているすべての出版社を含めるように指示しています。しかし、書籍にリンクされた出版社はデータベースにまだありません。したがって、コンテキスト内のすべての本では、発行者が null に設定されています。

その行はデバッグを妨げており、混乱を招いています。

その行を削除して元のエラーに戻ると、既に存在するパブリッシャーを追加しようとしたことが問題であることがわかると思います。これを行うと、次のようになります。

book.Publisher = publisherRepository.Get(1);
bookRepository.Add(book);

メソッドはAddグラフ全体 (つまりBookと の両方Publisher) を としてマークしますAddedが、パブリッシャはデータベースに既に存在するため、これは正しくありません。

Book で外部キーを使用すると、この問題を回避できます。このような:

book.PublisherID = 1;
bookRepository.Add(book);

この動作の包括的な説明は次のとおりです。

エンティティ フレームワークが既存のオブジェクトをデータベースに再挿入するのはなぜですか

于 2013-10-28T09:48:49.387 に答える
0

さて、ナビゲーション プロパティの [Required] 属性を削除すると、どういうわけかエラーが削除されました。他の行が影響を受ける理由はまだ完全にはわかりません。

于 2013-10-28T11:31:22.480 に答える