3

複数の連続したデータを追加すると、SaveChanges() メソッドでエラーが発生しました。

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

私のベースサービス

public void Delete(T entity)
    {
        ObjectSet.DeleteObject(entity);
        Context.SaveChanges();
    }

    public void Add(T entity)
    {
        ObjectSet.AddObject(entity);
        Context.SaveChanges();

    }

    public void Attach(T entity)
    {
        ObjectSet.Attach(entity);
        Context.SaveChanges();
    }

    public void Update(Expression<Func<T, bool>> where, T entity)
    {
        var ent = First(where);
        ent = entity;
        Context.SaveChanges();
    }
4

2 に答える 2

1

私はこの問題を抱えていて、次の操作を行っていて、EntityFramework がデータベース内のデータと同期していないことがわかりました。

1) Entity Framework のコンテキストを使用して、テーブルの行に対してクエリを実行します。そうすることで、EntityFramework コンテキストは、これらのオブジェクトのコピーをローカル ビューに保持します。

2) SQL クエリを使用してテーブルを切り捨てます (したがって、Entity Framework コンテキストはこれが発生したことを認識しません。データベースで切り捨てられた場合でも、エンティティはローカル ビューに残ります)。テーブルの主キーは自動インクリメント (IDENTITY (1,1)) であるため、切り捨て呼び出しにより、テーブルの主キー カウンターが 1 にリセットされます。

3) Entity Framework を使用してテーブルに行を追加し、SaveChanges() を呼び出します。テーブルの切り捨てのため、新しい行の主キーは 1 です。行を作成した後、EntityFramework はデータベースに対して行の値を照会し、新しいエンティティを作成し、エンティティに値を入力し、エンティティをローカル ビューに追加します。 .

コンテキストには、プライマリ キー = 1 の別のオブジェクトがローカル ビューに格納されているため (手順 1 から)、同じプライマリ キーを持つ 2 番目のエンティティをローカル ビューに追加しようとすると、例外がスローされます。

この状況を回避するには、新しい操作を行う前に、Entity Framework をデータベース コンテンツと同期させておく必要があります。

私の場合、次のように呼び出してこれを修正する必要がありました。

Context.MyTableEntities.Local.Clear();
Context.SaveChanges();

そのため、エンティティが最初に削除され、コンテキストがそれについて伝えられました。次に、SQL クエリを使用してテーブルを切り捨て、自動インクリメント カウンターをリセットしました。

最初にオブジェクトがローカル ビューから削除され、その後テーブルの切り捨てが行われたため (自動インクリメント カウンターがリセットされます)、主キーの競合は回避されました。

それが役立つことを願っています。

于 2014-11-05T16:55:55.873 に答える
0

さまざまなエンティティを EF に追加していると確信していますか? 内部例外は、AcceptChanges()追加しようとしている現在のエンティティが、既に追跡されているエンティティとキーを共有しているため、失敗していると述べています。

の詳細についてはAcceptChanges()、http: //msdn.microsoft.com/en-us/library/system.data.objects.objectstateentry.acceptchanges.aspxをご覧ください。

于 2012-07-26T14:21:23.847 に答える