2013-03-10 83 views
2

我正在使用生產者 - 許多消費者模式。閱讀 - >消費 - >更新

數據庫已經有記錄。

  1. 生產者讀取記錄並將其放入線程安全隊列。
  2. 消費者線程進程逐個記錄並向其中添加更多數據。
  3. 現在生產者必須用消費者提供的新數據來更新數據庫中的記錄。

我是新的實體框架,不知道用什麼方法來正確更新這些記錄。

我讀過,我可以從db中選擇記錄列表,直接編輯字段,然後在上下文對象上簡單地調用SaveChanges。但我懷疑有些消費者會在列表中編輯一些屬性。

+0

爲什麼消費者不能更新數據庫? – vlad 2013-03-10 17:32:26

+0

他們可以嗎?我不確定用多線程更新與相同上下文的數據庫是否合適。閱讀EF文件..我希望在這種情況下得到有關最佳實踐的快速建議。 – user1876232 2013-03-11 02:40:38

回答

0

試試這個。第一個示例顯示如何更新單個記錄,第二個示例顯示如何使用記錄列表進行更新。只要它們是數據模型中的類型,就可以從列表中的任何對象添加或刪除所需的數據。然後調用你的數據庫上下文並遍歷列表中的每個對象。用SaveChanges()更新數據庫。

public List<Customer> MyCustomers { get; set; } 

    public void GetCustomers() 
    { 
     using(var context = new SalesContext()) 
     { 
      var customers = from b in context.Customers 
          select b; 

      MyCustomers = customers.ToList<Customer>(); 
     } 
    } 

    public void MethodThatChangesCustomers() 
    { 

    } 

    public void UpdateDatabase() 
    { 
     using(var context = new SalesContext()) 
     { 
      foreach (var person in MyCustomers) 
      { 
       context.Customers.Add(person); 
      } 
      context.SaveChanges(); 
     } 
    } 
+0

謝謝!但是,好像你沒有閱讀我的問題......我想讀取隊列中的幾條記錄,讓消費者向它添加數據,然後將其更新回數據庫。 – user1876232 2013-03-10 17:11:17

+0

當你說queue時,你指的是從數據庫中抽取的對象到IEnumerable ? – 2013-03-10 17:15:13

+0

是的,正確的。拉入enumerable,然後通過調用ToList() – user1876232 2013-03-10 17:21:35