2016-03-24 169 views
0

我想遍歷一系列傳入記錄,檢查我的數據庫以查看它們是否已經存在,並根據需要添加或更新它們。我沒有成功。實體框架 - 更新或添加

var listOfClientAccounts = model.MTAccounts.ToList(); // single DB query 
    // for each of the users MTManager 
    foreach (var user in users) 
    { 
     var clientInDb = listOfClientAccounts 
          .SingleOrDefault(c => c.Login == user.Login); // runs in memory 
     var processedUser = ProcessUserRecord(user); 
     //Check if the Account Login is already in the database 
     if (clientInDb != null) 
     { 
      processedUser.MTAccountId = clientInDb.MTAccountId; 
      var entry = model.Entry(processedUser); 
          model.Entry(processedUser).CurrentValues.SetValues(processedUser); 
      entry.State = EntityState.Modified; 
      Console.WriteLine(x + " : UPDATE : " + processedUser.Login + "(" + clientInDb.MTAccountId + ")"); 
     } 
     else 
     { 
      // Client does not exist add now 
      model.MTAccounts.Add(processedUser); 
      Console.WriteLine(x + " : ADD :" + processedUser.Login); 

     } 
    } 


model.SaveChanges(); 

public MTAccount ProcessUserRecord(UserRecord user) 
     { 
      MTAccount DALUser = new MTAccount 
      { 
       BrokerServerId = 1, 
       Login = user.Login, 
       Group = user.Group 
      }; 
      return DALUser; 
     } 

關鍵的東西是,我想保持的SaveChanges調用直到循環結束,因爲可能有數以百計的記錄打電話,我不想讓上百分貝的呼叫。

有誤差如下:

會員「CurrentValues」不能被稱爲類型 「MTAccount」的實體,因爲實體沒有在上下文中。要向上下文添加 實體,請調用DbSet的Add或Attach方法 。

+1

和你的代碼有什麼問題? –

+0

由於您已經構建了這個結構,調用SaveChanges的位置並不重要,您仍然可以撥打數百個電話。您需要批量插入/更新,這在EF中本地不可用,並且需要擴展庫 –

+0

您的模型是什麼?當然,你只需要模型,並添加一個新的實體或在調用'SaveChanges()'之前編輯匹配的實體 - 你在做什麼?有什麼問題? – RemarkLima

回答

0

好吧,我在原來的代碼中,我有工作了,

var entry = model.Entry(processedUser); 
model.Entry(processedUser).CurrentValues.SetValues(processedUser); 

這是試圖更新processedUser 的我應該說是這樣的值:

model.Entry(clientInDb).CurrentValues.SetValues(processedUser); 

從數據庫

012施加變更到原始客戶端

感謝您的意見。