2017-07-23 3 views
0

In meiner MVC-Anwendung zu aktualisieren, habe ich eine Methode, die ein Unternehmen zur Datenbank hinzufügen soll (wenn es nicht vorhanden ist), oder aktualisieren (wenn es bereits in der Datenbank ist)Wie Datenbank mit DbSet

 //... 
     var list = _context.CurrencyRepository.Get().ToList(); 

     foreach (var currency in currencies) 
     {     
      var item = list.FirstOrDefault(c => c.CurrencyId == currency.CurrencyId); 

      if (item != null) 
      { 
       _context.CurrencyRepository.Update(currency);               
      } 
      else 
      { 
       _context.CurrencyRepository.Add(currency); 
      } 
     } 

     _context.CommitChanges(); 
     //... 


    public virtual void Update(T entityToUpdate) 
    { 
     //both lines fail with the same error message 
     _dbSet.Attach(entityToUpdate); 
     _dbContext.Entry(entityToUpdate).State = EntityState.Modified; 
    } 

    public virtual T Add(T entity) 
    { 
     return _dbSet.Add(entity); 
    } 

    public void CommitChanges() 
    { 
     _dbContext.SaveChanges(); 
    } 

Es funktioniert für das Hinzufügen, aber leider bekomme ich einen Fehler, wenn ich versuche zu aktualisieren:

eine Einheit vom Typ ‚Währung‘ Anbringen schlug fehl, da eine andere Einheit des gleichen Typs hat bereits die gleiche primäre Schlüsselwert. Dies kann passieren, wenn Sie die Methode "Attach" verwenden oder den Status einer Entität auf "Unverändert" oder "Modifiziert" setzen, wenn Entitäten im Diagramm widersprüchliche Schlüsselwerte aufweisen. Dies liegt möglicherweise daran, dass einige Entitäten neu sind und noch keine datenbankgenerierten Schlüsselwerte erhalten haben. In diesem Fall verwenden Sie die "Add" -Methode oder den Entity-Status "Added", um den Graphen zu verfolgen und anschließend den Status von nicht-neuen Entitäten auf "Unchanged" oder "Modified" zu setzen.

Könnte jemand erklären, wie ich bitte meine Datenbank aktualisieren soll?

Antwort

1

Das Problem besteht darin, dass die Abfrage zum Abrufen des Elements Currency bereits das Diagramm im Kontext gefüllt hat, der die Entitäten verfolgt. So können Sie entweder manuell aktualisieren, um die Eigenschaften der bestehenden (d item.Name = currency.Name; usw.), die eher umständlich ist oder können Sie die Einheit stoppen, indem AsNoTracking() nachverfolgt werden:

var results = db.Set<Currency>().AsNoTracking().Where(...); 
//        ^^^^^^^^^^^^^^ 
+0

vielen Dank für Ihre Antwort. Ich denke, jetzt verstehe ich – Egor

Verwandte Themen