2016-03-24 7 views
0

Я хочу пропустить цикл входящих записей, проверить свою базу данных, посмотреть, существуют ли они, добавить или обновить их по мере необходимости. У меня мало успеха.Entity Framework - обновление или добавление

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», так как объект не существует в контексте. Чтобы добавить объект в контекст, вызовите метод Add или Attach для DbSet.

+1

и в чем проблема с кодом? –

+0

Как вы структурировали это, не имеет значения, где вызывается SaveChanges, вы будете STILL делать сотни вызовов. Вам нужно выполнить вставку/обновление, которое не доступно изначально в EF и требует библиотек расширений. –

+0

Какова ваша модель? Разумеется, вы просто берете модель и добавляете новую сущность или редактируете согласованный объект перед вызовом 'SaveChanges()' - что вы делаете? В чем проблема? – RemarkLima

ответ

0

Хорошо, я работал его,

в исходном коде я имел:

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

, который пытается обновить значения processedUser То, что я должен был сказать, было это:

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

, который применил изменения исходного клиента из базы данных

благодарит за комментарии.

Смежные вопросы