2016-05-06 10 views
0

Angenommen, ich lese Daten aus einer Excel-Datei und muss diese mit EF speichern. Nach dem Lesen von Excel, konstruiere ich eine Entität des Typs in meinem EF-Modell - sagen Holiday.Speichern einer expliziten Entität über Entity Framework

Die Chance ist, dass dieser bestimmte Urlaub bereits in meiner DB existiert oder nicht. Ich kann es nicht nur durch das Lesen der Excel-Datei wissen. Ich überprüfe also, ob diese Entität existiert, wenn ich die vorhandene Entität ändern oder eine neue Entität hinzufügen muss.

Folgendes ist, wie ich die Logik handhabe.

foreach (var holiday in clientDataObj.Holidays) 
{ 
    // to check for existing holidays, no need to consider the location, as all holidays will anyway exist at root level. 
    Holiday existingHoliday = 
       ClientContext.Holidays.SingleOrDefault(h => string.Equals(h.Date, holiday.Date)); 

    if (existingHoliday == null) 
    { 
     rootLocation.Holidays.Add(holiday); 
    } 
    else 
    { 
     holiday.HolidayId = existingHoliday.HolidayId; 
     ClientContext.Entry(existingHoliday).State = System.Data.Entity.EntityState.Detached; 
     ClientContext.Entry(holiday).State = System.Data.Entity.EntityState.Modified; 
    } 
} 

ClientContext.SaveChanges(); 

Ich habe den Code noch nicht ausgeführt, um zu sehen, ob es funktioniert. Kann jemand eine Vorstellung davon geben, ob dies der richtige Weg ist, oder gibt es andere bewährte Methoden, um dieses Problem anzugehen?

Antwort

1

Nein, das wird nicht funktionieren. Wenn Sie eine Entität entfernen, wird sie nicht entfernt. Sie wird nur von der Verfolgung des Kontextes getrennt.

Sie müssen es entfernen und fügen Sie die neue:

ClientContext.Entry(existingHoliday).State = EntityState.Deleted; 
ClientContext.Entry(holiday).State = EntityState.Added; 

Auch im Falle, dass es zwei gleiche Urlaub in der Excel-Datei, können Sie durch einen passieren kann, dass Sie bereits hinzugefügt, so dass Sie müssen darauf achten. Abnehmen hier arbeiten, weil Sie nicht SaveChanges noch so das Unternehmen genannt haben, ist nicht in der Datenbank noch:

if(ClientContext.Entry(existingHoliday).State == EntityState.Added) 
    ClientContext.Entry(existingHoliday).State == EntityState.Detached; 

Ich bin mir nicht sicher, warum Sie sie zu rootLocation hinzufügen, wenn sie existieren nicht auf die Datenbank, sollten Sie sie in den Kontext sein hinzufügen, wenn ich Ihre Logik folgen, so können Sie diese Schleife haben:

foreach (var holiday in clientDataObj.Holidays) 
{ 
    Holiday existingHoliday = 
       ClientContext.Holidays.SingleOrDefault(h => string.Equals(h.Date, holiday.Date)); 
    if (existingHoliday != null) 
    { 
     holiday.Id = existingHoliday.Id; 
     ClientContext.Entry(existingHoliday).State = 
        ClientContext.Entry(existingHoliday).State == EntityState.Added  
          ? EntityState.Detached 
          : EntityState.Deleted; 
    }  
    ClientContext.Entry(holiday).State = System.Data.Entity.EntityState.Added; 
} 

Noch einmal, ich bin mir nicht sicher, was rootLocation ist so könnte Ihre Logik unterschiedlich sein.

Als weitere Optimierung, wenn die Feiertagsliste nicht zu groß ist, sollten Sie alle auf Speicher laden, anstatt SingleOrDefault bei jeder Iteration aufzurufen, die die Datenbank treffen wird.

Also nur einen einzigen Treffer auf die Datenbank haben alle von ihnen zu laden (wieder, wenn es nicht zu viele sind und Speicher ist kein Problem), und in dem Client suchen:

var allHolidays = ClientContext.Holidays.ToList();  
foreach (var holiday in clientDataObj.Holidays) 
{ 
    Holiday existingHoliday = 
       allHolidays.SingleOrDefault(h => string.Equals(h.Date, holiday.Date)); 
    /* ... */ 
} 

Dies sollte nur Einmalige Abfrage der Datenbank

Beachten Sie, dass Sie bei Verwendung dieser Methode und des oben genannten Verfahrens auch die neuen Feiertage zur Liste hinzufügen müssen, damit sie überprüft werden, ob der Excel-Import Duplikate enthalten kann. Dies ist alles nicht in Ihrer Frage angegeben, überprüfen Sie die Spezifikationen.

+0

Danke, ich werde das versuchen. – devC

+0

Danke, Sie haben dort einige wertvolle Vorschläge. – devC

+0

Hallo, ich habe das Problem mit Ihrem Vorschlag gelöst, aber jetzt gibt es ein neues Problem. Schätzen Sie, wenn Sie helfen können. http://stackoverflow.com/questions/37202341/ef-associated-entity-istrying-to-add-to-the-database-when-adding-an- entity – devC

Verwandte Themen