2016-03-24 11 views
0

Ich möchte eine Reihe eingehender Datensätze durchlaufen, überprüfen Sie meine Datenbank, um zu sehen, ob sie bereits vorhanden sind, und fügen Sie sie hinzu oder aktualisieren Sie sie entsprechend. Ich habe wenig Erfolg.Entity Framework - Update oder Hinzufügen

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; 
     } 

Entscheidend ist, dass ich die savechanges rufen bis zum Ende der Schleife halten wollen, wie es zu nennen Hunderte von Datensätzen sein, und ich möchte nicht Hunderte von db Anrufe tätigen.

es Fehler ist wie folgt:

Mitglied ‚CurrentValues‘ kann nicht für die Entität des Typs ‚MTAccount‘ genannt werden, da das Unternehmen nicht im Zusammenhang existiert. Um eine Entität zum Kontext hinzuzufügen, rufen Sie die Methode Add oder Attach von DbSet auf.

+1

und was ist das Problem in Ihrem Code? –

+0

Mit wie Sie dies strukturiert haben, ist es egal, wo SaveChanges aufgerufen wird, Sie werden immer noch Hunderte von Anrufen machen. Sie müssen Batch-Einfügung/Aktualisierung, die nicht nativ in EF verfügbar ist und Erweiterungsbibliotheken benötigt –

+0

Was ist Ihr Modell? Sicher, du nimmst einfach das Modell und fügst entweder eine neue Entität hinzu oder editierst die passende Entität, bevor du 'SaveChanges()' nennst - Was machst du? Was ist das Problem? – RemarkLima

Antwort

0

Ok, ich war es aus,

im ursprünglichen Code, den ich hatte:

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

, die die Werte des processedUser zu aktualisieren versuchte Was soll ich gesagt haben, war dies:

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

, die die Änderungen an den ursprünglichen Client von Datenbank angewandt

danke für die Kommentare.

Verwandte Themen