2016-07-28 7 views
1

私はEF6 ORMを使用するアプリケーションを持っています。2つのスレッドと2つのDataContextsが2回挿入されます

新しいオブジェクトを作成するメソッドがあります。私はまた、アプリケーションのロギングを担当するスレッドを持っています。 LogObjectをエンキューし、5秒ごとにデータベースに保存します。

ユーザーが新しいオブジェクトを作成するメソッドを呼び出します。

using(DataContext context = new DataContext() { 
    context.MyObjects.Add(new MyObject() { prop1 = "test" }); 
    context.SaveChanges(); // save #1 
    Log("A new MyObject was created!"); // this method enqueues log info 
} 

方法を保存ロガーデータベースは以下の通りです:

private void Flush() { 

    using (DataContext db = new DataContext() { 
     foreach(Log l in _logs) { 
      db.Logs.Add(new LogObject() { propX = "blabla" }); 
     } 
     db.SaveChanges(); // save #2 
    } 
} 

正しく#1挿入オブジェクトを保存します。 問題は、save#2も同じMyObject()を挿入することです。

私はデータベースをプロファイリングし、プロセスをデバッグしました。

+0

[mcve]が便利です。これは、 'save#2'に 'save#1'で保存したオブジェクトが関わっている場合に発生する可能性があります。これはあなたの質問では当てはまらないようですが、おそらく実際のコードではありません。 –

+1

'LogObject'にはナビゲーションプロパティがありますか(おそらく' MyObject'に)? –

+0

@BradleyUffnerそれが問題でした。ログにMyObjectのナビゲーションプロパティがありました...ありがとうございました! – Baral

答えて

1

このような動作が見られるときは、オブジェクトがコンテキストによって追跡されていないと考えてください。コンテキストを作成して処分しているので、オブジェクトはおそらく追跡されません。また、EFでは新しいオブジェクトとみなされるため、再度挿入されます。

オブジェクトを再度添付して、EFがそれを追跡し、それが新しいオブジェクトではないことを認識するようにしてください。

0

多分同じ文脈に入れていますか?私の理解では、DBには何が起きているのかを記録するだけです。それは "タイマー機能"を必要としません。または、あなたがより多くのコントロールを持っている別のORMを選択してください...

関連する問題