.NET Entity FrameworkでSaveChangesを呼び出すとInvalidOperationExceptionが発生する

.net c# entity-framework

質問

Entity Frameworkの使い方を学ぼうとしていますが、解決できない問題にぶつかりました。私がやっているのは、私が持っている映画のリストを調べて、それぞれを単純なデータベースに挿入するということです。

これは私が使っているコードです

private void AddMovies(DirectoryInfo dir)
{
    MovieEntities db = new MovieEntities();
    foreach (DirectoryInfo d in dir.GetDirectories())
    {
        Movie m = new Movie { Name = d.Name, Path = dir.FullName };
        db.AddToMovies(movie);
    }
    db.SaveChanges();
}

これを行うと、db.SaveChanges()で例外が発生します。

データベースへの変更は正常にコミットされましたが、オブジェクトコンテキストの更新中にエラーが発生しました。 ObjectContextが矛盾した状態になっている可能性があります。内部例外メッセージ:オブジェクトのキー値がObjectStateManager内の別のオブジェクトと競合するため、AcceptChangesを続行できません。 AcceptChangesを呼び出す前に、キー値が一意であることを確認してください。

この問題の原因を突き止めることができませんでした。私のデータベーステーブルには3つの列があります
Id intオートインクリメント
名前nchar(255)
パスnchar(255)

更新日:edmxファイルとSSDLセクションのStoreGeneratedPattern = "Identity"が推奨どおりであることを確認しました。私はブログの記事にも従って、そこで提案されているようにCSDLにClientAutoGenerated = "true"とStoreGenerated = "true"を追加しようとしました。これによりコンパイルエラーが発生しました(エラー5: 'ClientAutoGenerated'属性は許可されていません)。ブログ投稿は2006年からのもので、フォローアップ投稿へのリンクがあるので、変更されたと思います。

しかし、私はフォローアップの投稿を読むことができません。なぜならそれはmsdnアカウントを必要とするようだからです。

受け入れられた回答

私はこれに対する解決策を見つけました。

テーブルを作成したときに主キーを追加するのを忘れて(Is Identity)プロパティをyesに設定していました。それから私は自分のEntityモデルを作成し、このエラーを受けました。

私は戻ってデータベーステーブルを修正しましたが、それでも奇妙な例外が発生します。最後に問題を解決したのは、エンティティを削除し、テーブルが修正された後にエンティティを再作成することでした。

これ以上の例外はありません:)


人気のある回答

前回私は次のコードを試してみました、そして、私はそれがうまくいっていると言いました

bs.SuspendBinding();
Data.SaveChanges();
bs.ResumeBinding();

私が今日あなたに伝えている重要なことは、次のとおりです。

1 - 上記のコードを使用してバインディングを一時停止した場合、コレクションで失われたインデックスやマスター詳細バインディングなど、多くのシナリオを修正するためにさらにコードを追加する必要があります。

2 - 上記のコードの代わりに次のコードを使用すると、例外がなくなり、これ以上コードを書く必要がない場合はすべて問題なく動作するはずです。

        Data.SaveChanges(System.Data.Objects.SaveOptions.None);

私はこれがあなたの同じような問題を解決することを願っています

皆ありがとう



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ