2016-07-28 65 views
1

我有一個使用EF6 ORM的應用程序。兩個線程和兩個DataContexts插入兩次

我有一個方法來創建一個新的對象。我也有一個負責應用程序日誌記錄的線程。它入侵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插入對象正確。 問題是保存#2也插入了一個相同的MyObject()...

我剖析了數據庫並調試了這些進程。

+0

A [mcve]會很有用。如果'save#2'涉及保存在'save#1'中的對象,這可能會發生 - 這似乎不是您的問題的情況,但它可能不是真正的代碼。 –

+1

'LogObject'是否有任何導航屬性(可能是'MyObject')? –

+0

@BradleyUffner這是問題所在。日誌有一個導航屬性MyObject ...謝謝! – Baral

回答

1

只要你看到這樣的行爲,就認爲該對象沒有被上下文跟蹤。您正在創建一個上下文並對其進行處理,以便該對象可能未被跟蹤,並且對於EF它被認爲是一個新對象,這就是爲什麼它被再次插入。

您應該再次附加對象,以便EF跟蹤它並知道它不是新對象。

0

把它們放在同一個環境中吧?在我的理解中,你只會記錄進入數據庫的內容....這不需要「定時器功能」。或者選擇另一個ORM,你有更多的控制權...