2016-04-22 3 views
4

Ich habe eine einfache Entität.Entity Framework, habe ich diesen Eintrag zuvor hinzugefügt?

public partial class Thing 
{ 
    public Thing() 
    {} 

    public int Id { get; set; } 
    public string Name { get; set; } 
} 

Ich füge Tausende von neuen Einträgen in eine lokale Datenbank ein, aber es wird nur ein paar hundert einzigartige Dinge geben. Wenn ich SaveChanges nach jeder Einfügung, dann wird es sehr langsam laufen, aber wenn ich nicht SaveChanges dann kann ich nicht sagen, ob der newThing.Name bereits existiert. Oder kann ich? Ich bin ziemlich neblig auf die Überprüfung, wo etwas im Kontext der Datenbank vs vor/nach SaveChanges existiert. Kann das jemand für mich klären?

Thing newThing = new Thing(); 
newThing.Name = "MyName"; 

context.Things.Add(d); 

//returns null 
Thing myFirstThing = context.Things.FirstOrDefault(c => c.Name == newThing.Name); 

//returns false 
if (context.Detectors.Any(c => c.Name == newThing.Name)) 
{ //do some stuff} 

Antwort

0

Ich denke, dass Sie dies wahrscheinlich mit dem ChangeTracker auf Ihrem DbContext tun können, ABER, würde es wahrscheinlich langsam sein.

//(warning: free-handing this): 
myContext.ChangeTracker.Entries<theEntityType>().Any(e => e.State == EntityState.Added && e.Entity.TheField == yourString); 

Ich denke, dass (oder etwas in der Nähe funktionieren würde, aber es könnte sehr langsam bekommen, wie Sie bei jedem Aufruf eine Sammlung scannen (es wäre ein wenig langsamer erhalten nach jedem hinzufügen -. Eine Sammlung mit der 1000 Mitglieder Statt eine Menge Ticks)

brennen würde, können Sie die Einheit zu einem Wörterbuch hinzufügen könnte < Yourstring, theEntity > wie Sie sie hinzufügen. Key-basierte Abfragen in einem Wörterbuch sind O (1), so dass selbst wenn Sie Wenn Sie eine Million Einträge im Wörterbuch haben, ist die Suche sehr schnell. Löschen Sie das Wörterbuch, wenn Sie die Entity speichern, um im Speicher zu bleiben.

+0

Danke für die Antwort. Ich denke, ich werde mit Ihrer Wörterbuchidee gehen. Es gibt nur 400 eindeutige Einträge. Ich werde wahrscheinlich eine Liste obwohl verwenden. – kurgaan

+1

@ kurgaan Froh, zu helfen. Wenn Sie jedoch eine Liste verwenden, erhalten Sie nicht die Leistung eines Wörterbuchs. Wenn Sie eine Liste durchsuchen, durchläuft sie nur die Liste. Wenn Sie ein Dictionary oder Hashset verwenden, führt es keine einfache Schleife durch - es ist eher so, als hätte es einen Index und Sie erhalten eine viel bessere Leistung beim Nachschlagen. – JMarsch